Leetcode-2 专业地写一个链表
一 首先就是涉及到一个null和nullptr的区别的问题。之前就经常出现==NULL的问题。
二 c语言,c++,python如何初始化一个节点指针的问题。
首先就是c语言,需要十分熟练地使用malloc函数。
#include<bits/stdc++.h> using namespace std; typedef struct linklist { int data; struct linklist *next; }Linklist; int main() { Linklist *p=(Linklist*)malloc(sizeof(Linklist)); p->data=0; p->next=NULL; Linklist *head=p;//这样就保存了头节点 for(int i=1;i<=4;i++) { Linklist *temp=(Linklist*)malloc(sizeof(Linklist)); temp->data=i*2; temp->next=NULL; p->next=temp; p=temp; } p=head; while(p!=NULL) { cout<<p->data<<endl; p=p->next; } return 0; }
即使对于c语言的代码风格有所遗忘,看了这一串代码,或者写一下,就能明白了。
下面是c++中。c++主要就是加入了面向对象编程的内容。
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
这个要会面向对象编程。复习一下C++即可。
struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; int main() { ListNode *l1=new ListNode(1); ListNode l2(2); cout<<l1->val<<endl; cout<<l2.val<<endl; }
这样就十分地清楚了。
Linklist *temp=(Linklist*)malloc(sizeof(Linklist));这是c语言说法。
至于构造函数,默认构造函数,无参构造函数,这些就是单独的面向对象编程内容了,很简单。
代码风格熟悉,指针,引用的问题(Linklist),这个需要实际的熟悉。
明白指针是一串地址的值,用这个地址为内存块的操作服务就明白了。
三 实际解题过程
实际操作的时候发现,这是个不怎么方便处理的链表,想要把这个链表相加的程序写地漂亮,并且时空复杂度都尽可能小还是有一定的难度的。
就这样吧
#include<bits/stdc++.h> using namespace std; struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *p1=l1,*p2=l2; int cursum=0; int mod=0; cursum=p1->val+p2->val+mod; mod=cursum/10; cursum%=10; p1=p1->next; p2=p2->next; ListNode *ret=new ListNode(cursum); ListNode *p=ret; while(p1!=nullptr||p2!=nullptr) { int val1=0,val2=0; if(p1!=nullptr) { val1=p1->val; p1=p1->next; } if(p2!=nullptr) { val2=p2->val; p2=p2->next; } cursum=val1+val2+mod; mod=cursum/10; cursum%=10; ListNode *temp=new ListNode(cursum); p->next=temp; p=p->next; } if(mod==1) { ListNode *temp=new ListNode(mod); p->next=temp; } return ret; } void append(ListNode* l,int num)//这个效率不高 { ListNode *p=l; while(p->next!=nullptr)p=p->next; ListNode *temp=new ListNode(num); p->next=temp; } }; int main() { Solution s; ListNode *l1=new ListNode(3); s.append(l1,4); s.append(l1,2); ListNode *l2=new ListNode(4); s.append(l2,6); s.append(l2,5); ListNode *ans=s.addTwoNumbers(l1,l2); while(ans!=nullptr) { cout<<ans->val<<endl; ans=ans->next; } return 0; }