反转单链表的两种办法
方法一:
首先,创建一个与五个元素的单链表,定义三个指针,cur和next分别指向头结点和它的下一个结点,newhead指针来存储新的头结点(newhead初始值为NULL)。
如图:
第二步,将cur->next指向newhead,再将cur的值赋给newhead,然后cur和next向后移动,此时cur指向数字2,next指向3,如下图:(这一步操作断开了1和2之间的联系,1成为了新的头结点,重复执行此步骤,类似于单链表的头插)
后面的循环步骤用图片演示:
最后一步,cur指向NULL,循环结束,此时newhead是逆转后的链表的头结点。
下面是具体的代码实现:(不包含该单链表结构体的定义)
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode*cur;
struct ListNode*next;
struct ListNode*newhead=NULL;
cur=head;
while(cur)
{
next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
}
方法二
第二种方法于第一种相比更加容易理解,建立三个指针 n1, n2, n3, n1初始值为NULL,n2为该链表的头结点,n3为n2的下个结点,如下图:
下一步操作与方法一类似,断开n2和n3之间的联系,让n2指向n1,然后更新n1 ,n2 ,n3,如图:
然后继续循环操作,直到n2指向NULL结束,n1即为逆转后的链表的头结点。
代码如下:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*n1,*n2,*n3;
n1=NULl;
n2=head;
n3=n2->next;
while(n2)
{
n2-next=n1;
n1=n2;
n2=n3;
if(n3) //判断n3是否存在,若不存在则无需后续操作
n3=n3->next;
}
return n1;
}
3;
if(n3) //判断n3是否存在,若不存在则无需后续操作
n3=n3->next;
}
return n1;
}
最后附上这道题目的leetcode链接:LeetCode逆转单链表(其中有该单链表结构体的具体定义)