首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【日拱一卒】链表——链表反转

【日拱一卒】链表——链表反转

作者头像
JackieZheng
发布于 2020-06-16 06:51:54
发布于 2020-06-16 06:51:54
47200
代码可运行
举报
文章被收录于专栏:JackieZhengJackieZheng
运行总次数:0
代码可运行

需求

实现链表的反转

输入:1->2->3->4->5

输出:5->4->3->2->1

难点

如果换成数据反转,你会吗(傻子才不会)。

按照常规思维,链表反转需要知道最后一个元素,然后从最后一个元素依次往前找,直到遍历到第一个元素即完成反转。

但是这里并不是双向链表,即使找到最后一个元素也找不到前继节点。再者,即使是双向链表,通过找到尾结点再往回遍历听着也不像是很高端的做法。

思路

除了找到尾结点进行反转的思路,我们是否可以考虑,在遍历的同时就去做反转的操作,类似

1->2->3->4->5

2->1->3->4->5

3->2->1->4->5

4->3->2->1->5

5->4->3->2->1

直觉告诉我们,肯定没问题,但是具体怎么做呢,看图

第一步:画出输入链表结构

第二步:初始化

注意

  • 为了不干扰head指针,重新定义一个新的cur指针,用于后面的遍历。pre指针表示最终反转后的链表指针
  • 指针存储了指向变量的地址,比如这里的cur存储的是head.next的地址

第三步:将1节点的next指向pre(即null)

注意

  • 此时的pre指向的是一个null的地址,需要注意的是pre是一个指针,pre还可以指向其他节点(参见下一步操作)

第四步:将pre指向1节点

注意

  • 将pre指向指向节点1,pre之前指向的是null,现在指向节点1,所以图中虚线部分的连接就不存在了
  • 这时候,我们成功的将第一个节点纳入最终反转链表pre中

第五步:解决指针丢失问题

按照前面几步的思路,我们依次遍历后面的节点,并对遍历的节点做如上步骤的处理,这样,最终我们就会得到反转后的链表pre。

但是,这里有个指针丢失的问题。

原来cur指向节点1,cur.next指向节点2,但是在第三步的时候将cur.next指向了null。所以使用cur.next就无法满足我们遍历节点2的需求了。

这时候,我们需要一个新指针,用来保证链表遍历的时候不会断掉,如下图

注意

  • 这里next指针需要在第二步初始化的时候就做好,不然这时候做next=cur.next就无法指向节点2了

第六步:开启下一次迭代

注意

  • cur作为一个哨兵节点,指向节点2,开始像处理节点1一样处理节点2,直到遍历完所有节点

代码实现

版本1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func reversrList(head *ListNode) *ListNode {
	cur := head
	var pre *ListNode = nil
	for cur != nil {
		next := cur.Next
		cur.Next = pre
		pre = cur
		cur = next
	}
	return pre
}

对照该代码实现和上面几个步骤,基本就可以摸透链表反转的思路了。

这里还有一个更加简洁的代码实现

版本2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func reversrList(head *ListNode) *ListNode {
	cur := head
	var pre *ListNode = nil
	for cur != nil {
		pre, cur, cur.Next = cur, cur.Next, pre
	}
	return pre
}

个人感觉不是很好理解,所以将其拆解成上面的代码实现。

不忘初心

老王:你不好好种地,你以后长大能干什么

小王:学算法

老王:学算法?!你数组、链表、栈、队列、堆、排序、查找都整不明白,你学什么算法

小王:我只学链表反转

老王:。。。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​LeetCode刷题实战92:反转链表 II
https://leetcode-cn.com/problems/reverse-linked-list-ii/
程序员小猿
2021/01/19
3190
链表:听说过两天反转链表又写不出来了?
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
代码随想录
2020/08/18
3910
【日拱一卒】链表——两个有序的链表合并
思路就是挨个比较两个链表中的元素,谁更小就先取谁,然后记得将指针移到下一个节点,直到遍历完两个链表。
JackieZheng
2020/08/11
4680
【日拱一卒】链表——两个有序的链表合并
两种方法求解链表高频面试题之单链表反转
单链表反转这道题可谓是链表里面的高频问题了,差不多可以说只要被问到链表,就会问单链表反转。 今天我们就一起来看下。
与你一起学算法
2021/03/23
3630
LeetCode—链表反转
这是无量测试之道的第211篇原创 题目来源于 LeetCode 的第 206 题,难度为:easy。目前的通过率是71.7%。 题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 题目解析 设置三个节点pre、cur、next (1)每次查看cur节点是否为NULL,如果是,则结束循环,获得结果 (2)如果cur节点不是为NULL,则先设置临时变量next为cur的下一个节点 (3)让cur的下一个节点变成指向pre,
Wu_Candy
2022/07/04
3150
LeetCode—链表反转
图解精选 TOP 面试题 005 | 反转链表之迭代求解
链表反转在面试中非常常见,我也在面试中遇到过这道题。在本篇文章中我们先说说如何用迭代法求解该题。
江不知
2019/12/19
5640
图解精选 TOP 面试题 005 | 反转链表之迭代求解
【日拱一卒】链表——回文判断
如果将链表形式换成数组,是不是就简单很多了。针对一个长度为n的数组,我们可以一一比对节点0和节点n-1,节点1和节点n-2,直到收尾索引相等。
JackieZheng
2020/07/14
3850
看一遍就理解,图解单链表反转
反转链表是程序员必备的基本素养,经常在面试、笔试的过程中出现。一直觉得反转链表实现代码不是很好理解,决定搬leetcode那道经典反转链表题出来,用十多张图去解析它,希望加深大家对链表反转的理解,谢谢阅读。
捡田螺的小男孩
2020/04/15
6780
看一遍就理解,图解单链表反转
链表问题-LeetCode 206、234、160(反转,回文,公共结点)
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
算法工程师之路
2019/11/04
3930
七十、反转和合并链表、 链表有环的判断
最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解常见的链表题目实现思路及附上答案,这些题目在leetcode上对应的题号也有给出,好好学习算法吧~
润森
2022/08/17
5000
七十、反转和合并链表、 链表有环的判断
链表问题,如何优雅递龟?
大家好,我是来自「华为」的「程序员小熊」。绝大部分童鞋都知道,解决「链表」相关问题时,常用的解题套路主要包括「双指针」、「迭代」和「虚拟头节点」等等。
程序员小熊
2021/06/07
4320
链表问题,如何优雅递龟?
LeetCode每日一题-1:反转链表
链表一般都是用迭代或是递归法来解决,而且一般都是构造双指针、三指针,比如反转链表或是DP动态规划。
墨明棋妙27
2022/09/23
2270
一文搞懂《链表反转》
翻转链表一直都是热门题目,笔者就在某大型互联网公司的面试题中碰到过这种题目,这种题目很常常见,相对应的变形和扩展也很多,今天我们就来攻克它吧。
lucifer210
2019/09/25
1.1K0
一文搞懂《链表反转》
36 张图带你深刻理解链表
在浅谈数组这篇文章中,我们说到数组在内存中是用一块连续的内存空间存储的。由于是用连续内存空间存储的,那么就会出现,明明还剩50M内存,但由于不是连续的,而导致在创建一个大小为50M的数组时,申请内存失败。
五分钟学算法
2021/03/10
8600
【日拱一卒】链表——链表反转(递归解法)
f(n) = f(n-1) + f(n-2); f(1) = 1, f(2) = 1
JackieZheng
2020/07/02
6510
LeetCode-面试题24-反转链表
局部反转,将当前节点的后一个节点保存在temp指针里,改变cur指向前一个位置pre,然后向后移动一位pre和cur
benym
2022/07/14
2150
剑指offer | 面试题18:反转链表
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
千羽
2021/12/29
5240
剑指offer | 面试题18:反转链表
算法--链表相关套路
通常来说,链表的问题从概念上讲很简单,更多时单纯的考察编码能力,而不是设计和解决算法。
宇宙之一粟
2020/10/29
5090
算法--链表相关套路
链表反转问题
对于链表问题的求解,大体做法是画出图一步一步分析。一般都可以进行原地操作(即额外空间复杂度为O(1))。
你的益达
2020/08/05
3340
链表反转问题
JS算法探险之链表
说起,「链表」在前端领域,可能有些许的陌生。但是,它作为一个传统的数据结构,在一些高阶领域还是有用武之地的。
前端柒八九
2022/08/25
5800
JS算法探险之链表
相关推荐
​LeetCode刷题实战92:反转链表 II
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档