leadcode的Hot100系列--206. 反转链表
这里使用两种方式,
一个是直接从头往后遍历 -------> 迭代
一个是从最后一个往前遍历  -----> 递归
迭代
定义三个变量: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. 反转链表的更多相关文章
- leetCode:206 反转链表
		206. 反转链表 题目:反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 非递归代码: class Solution { public ListNode reverseLis ... 
- leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划
		如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ... 
- leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用
		提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ... 
- LeetCode 206. 反转链表(Reverse Linked List) 16
		206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ... 
- Java实现 LeetCode 206 反转链表
		206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ... 
- 每天一道面试题LeetCode 206 -- 反转链表
		LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ... 
- Leetcode春季打卡活动 第二题:206. 反转链表
		Leetcode春季打卡活动 第二题:206. 反转链表 206. 反转链表 Talk is cheap . Show me the code . /** * Definition for singl ... 
- leetcode 206. 反转链表 及 92. 反转链表 II
		206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ... 
- Leetcode题目206.反转链表(简单)
		题目描述: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: ... 
随机推荐
- jquery 用json设置css
			<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ... 
- jQuery省市联动
			<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ... 
- Expression Blend实例动画-大坝水位升高演示
			原文:Expression Blend实例动画-大坝水位升高演示 Expression Blend是个很强大的东西,用它可以完成很多不好做的动画效果. 动画的主要元素: 时间线(Timeline) : ... 
- Vue-cli入门(一)——项目搭建
			Vue-cli入门(一)——项目搭建 前言: Vue-cli是一款基于vue的项目脚手架工具,其集成了webpack环境和主要的依赖,对于我们的项目搭建.开发.打包.维护管理等都是非常的方便. 主要内 ... 
- Win8 Metro(C#)数字图像处理--2.41彩色图像密度分割算法
			原文:Win8 Metro(C#)数字图像处理--2.41彩色图像密度分割算法  [函数名称] 彩色图像密度分割函数 DensitySegmentProcess(WriteableB ... 
- murmurhash2算法 和 DJB Hash算法是目前最流行的hash算法
			murmurhash2算法 和 DJB Hash算法是目前最流行的hash算法 1.DJB HASH算法 1 2 3 4 5 6 7 8 9 10 11 /* the famous DJB Hash ... 
- DevExpress的xtraMessageBox汉化
			原文:DevExpress的xtraMessageBox汉化 项目使用的界面库是DevExpress 相当好用,不过里面弹出对话框XtraMessageBox的按钮都是英文的, 可能会对用户造成困扰, ... 
- 【SQL Server】SQL Server占用CPU使用率100%的解决方法
			原文:[SQL Server]SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题. 以前做的一个某污水处理厂自控系统项目,客户反映其自控 ... 
- 类选择器和所作用的标签一起写为什么不起作用? - CSDN博客
			原文:类选择器和所作用的标签一起写为什么不起作用? - CSDN博客 HTML代码: css样式: 这不是将样式作用于circle类下的有current类的li标签吗?为什么不起作用? 原因: 选择器 ... 
- 简析TCP的三次握手与四次分手(TCP协议头部的格式,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端)good
			2014-10-30 分类:理论基础 / 网络开发 阅读(4127) 评论(29) TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更 ... 
