反转链表

leetcode-206.   反转一个单链表
这里我们用到的方法是三指针法。

1.首先创建3个指针,分别指向头结点,头结点的前一个结点,头结点的下一个结点

 

 2.转变指针的方向,即将P2指向P1这样我们就可以将左边的看作一个新的链表,头结点为1,指向NULL

3.这时候我们移动P1,使P1=P2,将P1作为头结点,方便下一次的P2转向

 

4.挪动P2指针,为下一次转变指针方向做准备(这里就可以看出P3的作用是使右边的链表不至于丢失,为P2提供了下一次挪动的地址)

 

5.P3完成了使命,继续往前走,循环。上几步的操作

 

 

 6.大体思路就是这样,我们要注意的是到最后走到NULL时停下来的控制。

下图是走到后面的场景,我们可以看到此时P3和P2都走到了最后,我们要做的就是让循环停在这里,所以我们的循环条件就是P2!=NULL。

为什么不是P3呢,因为P3是先走到NULL值之后P2才改变了方向走到NULL的。

 

 

 

 

7.最后因为只有P1在头结点,所以返回P1

下面是具体的代码

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *pre = NULL; // P1指针
struct ListNode *cur = head; //P2指针
while(cur)
{
struct ListNode *next = cur->next; ///P3指针

cur->next = pre; //这一步很重要:反转
pre = cur;
cur = next;
}
return pre; //返回P1
}
 运行结果:

原文:https://blog.csdn.net/qq_36791466/article/details/88766450

posted on 2019-07-31 22:08  小柒妖-  阅读(80)  评论(1编辑  收藏  举报

导航