这里使用两种方式,

一个是直接从头往后遍历 -------> 迭代

一个是从最后一个往前遍历 -----> 递归

迭代

定义三个变量:pPre pNext pNow

pPre表示当前节点的前一个地址,pNext表示当前节点的下一个地址,pNow表示当前节点的地址。

反转的核心:就是把 pNow的next指针,指向 pPre

因为反转之后,pNow的next原来的值会丢,所以在反转之前,要用pNext把原来的值保存一下。

反转之后,要处理下一个节点,而本节点就是下一个节点的前一个节点,所以用pPre把当前节点地址保存一下。

struct ListNode* reverseList(struct ListNode* head){
struct ListNode *pstPre = NULL;
struct ListNode *pstNow = head;
struct ListNode *pstNext = NULL; while (NULL != pstNow)
{
pstNext = pstNow->next; // 先保存一下当前节点的next指针
pstNow->next = pstPre; // 做反转
pstPre = pstNow; // 更新pstPre指针
pstNow = pstNext; // 继续做下一个节点的反转
}
return pstPre;
}

递归

递归的话,不太好理解,先上代码,看着代码来理解:

struct ListNode* reverseList(struct ListNode* head){
struct ListHode *pstNewHead = NULL;
if (head == NULL || head->next == NULL) // 如果链表为空,或者是最末端节点,则直接返回当前节点地址
{
return head;
}
else
{
pstNewHead = reverseList(head->next); // 返回新链表头节点
head->next->next = head; // 这里完成反转
head->next = NULL; return pstNewHead;
}
}

递归写法的关键是:head->next->next = head 这句代码中,

head 是谁,head->next 是谁,head->next->next 又是谁!

可以从后往前理解,假设有三个节点,为 1 -> 2 -> 3,

最后一次:当head为节点2时,入参为传入节点3,节点3的next为NULL,返回节点3的地址。

此时:head指向节点2,pstNewHead指向节点3,

-----> 得到:head->next 指向节点3,head->next->next 就相当于节点3的next,

所以:执行完 "head->next->next = head"之后,就相当于把节点3的next指向了节点2,完成一个反转。

而节点2的next指针已经没用了(原本节点2的next指向了节点3),直接指向NULL。

上面部分实现了节点3与节点2的反转,并此时pstNewHead指向了节点3。

再继续。

上面返回pstNewHead为节点3的地址,此时入参的head为1(因为之前head为节点2,返回调用者的时候,是head->next为节点2,所以这里调用者为节点1),

所以,head->next为2,head->next->next 就相当于是节点2的next,所以执行完 "head->next->next = head"之后,就相当于把节点2的next指向了节点1

而节点1原来的next没用了(原本节点1的next指向了节点2),直接指向NULL,这里就相当于是链表尾部。

然后返回pstNewHead。

其实这里pstNewHead只赋值过一次,之后从未改变,一直指向了最一开始的节点3。

leadcode的Hot100系列--206. 反转链表的更多相关文章

  1. leetCode:206 反转链表

    206. 反转链表 题目:反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 非递归代码: class Solution { public ListNode reverseLis ...

  2. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  3. leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用

    提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...

  4. LeetCode 206. 反转链表(Reverse Linked List) 16

    206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...

  5. Java实现 LeetCode 206 反转链表

    206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ...

  6. 每天一道面试题LeetCode 206 -- 反转链表

    LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ...

  7. Leetcode春季打卡活动 第二题:206. 反转链表

    Leetcode春季打卡活动 第二题:206. 反转链表 206. 反转链表 Talk is cheap . Show me the code . /** * Definition for singl ...

  8. leetcode 206. 反转链表 及 92. 反转链表 II

    206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...

  9. Leetcode题目206.反转链表(简单)

    题目描述: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: ...

随机推荐

  1. 微信小程序特殊效果合集

    微信小程序的开发并不难,但是有时我们想做出比较炫的效果,可能会一时没有思路或找不到方法.下面就整理了微信小程序的一些特殊效果的案例,均来自网络,供你参考. 1.文字跑马灯效果:http://www.w ...

  2. HDU4421 Bit Magic 【2-sat】

    叙述性说明: 这给出了一个矩阵,原来的请求a排列 2-sat称号.对于每一位跑步边,跑31位可 详细的施工方 注意N=1的情况特判,还有检查对称元素是否同样 #include <stdio.h& ...

  3. TargetNullValue与FallbackValue

    原文:TargetNullValue与FallbackValue TargetNullValue与FallbackValue都是BindingBase的属性. TargetNullValue:获取或设 ...

  4. Xml格式的Bared和Warpped

    Bared   Wrapped  

  5. JS表格各行变色

    <head>    <title></title>    <script type="text/javascript">      ...

  6. qt5.9模块

    QAxContainer Module is a Windows-only extension for accessing ActiveX controls and COM objects 模块仅适用 ...

  7. 投资人的能量往往大多远远不仅于此,他能站在不同的角度和高度看问题(要早点拿投资,要舍得让出股份)——最好不要让 Leader 一边做技术、一边做管理,人的能力是有限的,精力也是有限的

      摘要:在创业三年时间里作为联合创始人,虽然拿着大家均等的股份,我始终是没有什么话语权的,但是,这也给了我从旁观者的角度看清整个局面的机会.创业公司的成败绝大程度取决于技术大牛和公司 Leader, ...

  8. UWP使用AppService向另一个UWP客户端应用程序提供服务

    原文:UWP使用AppService向另一个UWP客户端应用程序提供服务 在上篇里,我使用的是寄宿在WPF上的WCF进行两个程序间的通信,在解决问题的同时,我的同事也在思考能否使用UWP来做这件事.于 ...

  9. 用蓝牙连接debian和诺基亚手机

    本方法已经用debian 4.0.诺基亚9300和一个hl-united牌子的USB蓝牙适配器测试过了,效果很好.             1.安装必要的软件包:   #apt-get install ...

  10. 基于vue开发的多功能的时间选择器组件,开箱即用

    好一段时间没有写过博客了,在国庆期间心血来潮优化了一个组件,在日常开发中时常会有需求用到时间选择器,不同的项目需求可能会不一样.近期开发的几个项目中就有需求用到这样的选择器,由于以前有用到相关的组件, ...