这是单链表的练习题第二题,我们用两种解法讲解这道题!
难度 简单 OJ链接
解法一:
三个指针翻转方向:
我们定义一个prev,cur,next(帮我们记录下一个节点):
然后就会很简单了,我们将cur->next=prev,把prev=cur,cur=next,next=next->next,这样就循环下去了。
什么时候会结束呢?我们来看:
我们可以从图中得出结论:当cur为NULL时,我们结束循环。
看下面的代码:
struct ListNode* reverseList(struct ListNode* head){
//判断空链表
if(head==NULL)
return head;
struct ListNode* prev=NULL;
struct ListNode* cur=head;
struct ListNode* next=head->next;
while(cur)
{
cur->next=prev;
prev=cur;
cur=next;
next=next->next;
}
return prev;
}
这里其实是有错误的。
当我们循环快结束时,我们可以发现最后一行代码next=next->next;此时的next已经为NULL,我们再解引用的话,会出现错误。所以应该加一个判断条件:
struct ListNode* reverseList(struct ListNode* head){
//判断空链表
if(head==NULL)
return head;
struct ListNode* prev=NULL;
struct ListNode* cur=head;
struct ListNode* next=head->next;
while(cur)
{
cur->next=prev;
prev=cur;
cur=next;
if(next!=NULL)
next=next->next;
}
return prev;
}
解法二:
头插法:cur取原链表节点,头插到newHead所在的链表。
我们把cur->next=newHead,然后newHead=cur,cur=next,next=next->next,当cur为NULL时,结束循环。
代码如下:
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
return head;
struct ListNode* newhead=NULL;
struct ListNode* cur=head;
struct ListNode* next=cur->next;
while(cur)
{
cur->next=newhead;
newhead=cur;
cur=next;
if(cur)
next=cur->next;
}
return newhead;
}