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 进阶: ...
随机推荐
- wpf border内部元素内边角溢出问题 裁剪效果
效果图 <Grid> <Border BorderThickness=" BorderBrush="#3c4d72" CornerRadius=&quo ...
- C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...
- 调用API函数减少c#内存占用(20+m减至1m以下)
原文:调用API函数减少c#内存占用(20+m减至1m以下) c#虽然内置垃圾回收机制,但是并不能解决程序占用内存庞大的问题,如果我们仔细观察任务管理器,我们会发现一个程序如果最小化的时候,它所占用的 ...
- 动态lambda 构建
var param = Expression.Parameter(typeof(T)); var datetime1 = Expression.Constant(dt1); var datetime2 ...
- 人像美妆---妆容迁移算法研究(Makeup transfer)
原文:人像美妆---妆容迁移算法研究(Makeup transfer) 对于人像美妆算法,现在的美妆相机.玩美彩妆之类的app已经做的比较成熟了,但是具体算法,基本网络上是杳无可查,今天本人介绍一种自 ...
- Win8 Metro(C#)数字图像处理--2.74图像凸包计算
原文:Win8 Metro(C#)数字图像处理--2.74图像凸包计算 /// <summary> /// Convex Hull compute. /// </summary> ...
- WinForm 清空界面控件值的小技巧
原文:WinForm 清空界面控件值的小技巧 在WinForm里面有时候需要清空自己输入内容或是选择的选项,以便重新操作流程,那么一般你是怎么清空界面各个控件值的呢?如果窗体里面控件,尤其是TextB ...
- ADB命令笔记本
ADB即Android Debug Bridge,作为电脑操作手机的工具,被Android开发者和众多国内xxx安全管家所使用.在此记录一些常见的命令,随时更新,方便以后查找.(万一以后我也要开发一款 ...
- 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项。
“/”应用程序中的服务器错误. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项. 说明: 执行当 ...
- .NET Core2.1项目在Linux上使用验证码报Unable to load shared library 'gdiplus' or one of its dependencies
-- ::, 线程ID:[] 日志级别:ERROR 出错类:WebApp.HttpGlobalExceptionFilter property:[(null)] - 错误描述:System.TypeI ...