Leetcode:反转链表
示列:输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
一、迭代方法反转链表。
迭代是通过将1->2->3->4->5->NULL,一个个反转得到NULL<-1<-2<-3<-4<-5;
在进行迭代时我们需要定义三个结构体指针: n1 (表示要反转的前一个结点),n2(表示要反转的结点),n3(表示要反转的下一个结点);
n1的存在是为了让n2指向它,形成反转,n3是为了保存下一个结点的地址,否则,当反转一个后,链表会断开。
画图理解一下:代码实现如下:
typedef struct ListNode Node;
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL||head->next==NULL)//链表如果是一个或者NULL不用反转,直接返回。
{
return head;
}
Node*n1=NULL;//头的前一个
Node*n2=head;//头
Node*n3=head->next;//头的下一个
while(n2)
{
//反转,
n2->next=n1;//让头指向NULL
n1=n2;//向后走
n2=n3;
if(n3)//如果n3为空,n3就不能在想向后移动。
n3=n3->next;
}
return n1;
二、头插,反转链表。
先新定义一个结构体指针 头(newHead),保存链表的头(cur),保存链表的头的下一个(next);
把链表从左到右 头插到 新的头 上;
如图所示:代码如下:
typedef struct ListNode Node;
struct ListNode* reverseList(struct ListNode* head){
Node*cur=head;
Node*newHead=NULL;
while(cur)
{
Node*next=cur->next;//随着cur向后走,next也在向后走。
//头插cur当作新结点
cur->next=newHead;//头插
newHead=cur;//更新头
cur=next;//向后走
}
return newHead;
}
来源:oschina
链接:https://my.oschina.net/u/4280361/blog/4815311