news 2026/5/1 8:11:20

链表专题(二):乾坤大挪移——「反转链表」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表专题(二):乾坤大挪移——「反转链表」

场景想象:你是一队寻宝探险队的队长,队员们排成一列,每个人都把手搭在下一个人的肩膀上(1 -> 2 -> 3)。 现在命令来了:“全体向后转!”

  • 每个人都要松开搭在前面人肩膀上的手。

  • 每个人都要转身,把手搭在原本在自己后面那个人的肩膀上。

  • 原来的队长(头结点)变成了队尾,原来的最后一名变成了新队长。

核心痛点:链表是单向的,指针只能从前指到后。 如果我们想反转,就必须断开当前的指针cur.next,让它指向它的前一个节点pre。 但是!一旦我们断开了cur.next,我们就失去了去往下一个节点的路径。 所以,我们需要三个指针来配合这次“大挪移”。

力扣 206. 反转链表

https://leetcode.cn/problems/reverse-linked-list/

题目分析:

  • 输入:链表的头节点head

  • 目标:反转链表。

  • 输出:反转后的新头节点。

例子:1 -> 2 -> 3 -> 4 -> 5 -> NULL

  • 结果5 -> 4 -> 3 -> 2 -> 1 -> NULL

核心思维:双指针迭代法 (Pre & Cur)

我们需要两个主指针和一个辅助指针:

  1. cur(Current):当前操作的节点(初始为head)。

  2. pre(Previous):当前节点的前一个节点(初始为null,因为翻转后,原来的头结点后面是空)。

  3. temp(Temporary):临时保存cur的下一个节点(防止断链后找不到路)。

操作三部曲(在循环中):

  1. 保存路temp = cur.next(先记住下一个节点在哪,不然一会断开就丢了)。

  2. 反向指cur.next = pre(核心操作:把当前节点的指针指回前一个)。

  3. 整体挪

    • pre = cur(pre 指针向前挪一步)。

    • cur = temp(cur 指针向前挪一步,去处理下一个)。

代码实现 (JavaScript)

JavaScript

/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} head * @return {ListNode} */ var reverseList = function(head) { // pre 初始化为 null,因为反转后的尾节点指向 null let pre = null; let cur = head; while (cur !== null) { // 1. 先保存下一个节点,否则一会断链了就找不到了 let temp = cur.next; // 2. 核心反转:让当前节点指向前一个节点 cur.next = pre; // 3. 两个指针同时向前移动,准备处理下一个 pre = cur; cur = temp; } // 循环结束时,cur 变成了 null,而 pre 正好停留在新的头节点上 return pre; };

深度模拟

假设链表:1 -> 2 -> 3 -> null

  • 初始pre=null,cur=1

  • 第一轮

    • temp = 2(记路)

    • 1.next = null(1 指向 null,变成尾巴了)

    • pre = 1,cur = 2(都前进一步)

    • 链表状态null <- 1,2 -> 3

  • 第二轮

    • temp = 3

    • 2.next = 1(2 回头指 1)

    • pre = 2,cur = 3

    • 链表状态null <- 1 <- 2,3

  • 第三轮

    • temp = null

    • 3.next = 2(3 回头指 2)

    • pre = 3,cur = null

  • 结束cur为空,返回pre(也就是 3)。

总结

这道题看似简单,但它是链表题的绝对核心

  • 面试技巧:在纸上画出pre,cur,temp三个指针的移动过程,会让你的思路非常清晰。

  • 记忆口诀“存下一步,回头指,双双向前挪”


下一题预告:两两交换链表中的节点

接下来我们要把难度稍微提升一点点。LC 24. 两两交换链表中的节点

  • 输入1 -> 2 -> 3 -> 4

  • 输出2 -> 1 -> 4 -> 3

  • 这道题不仅要反转指针,还要维护好节点之间的连接关系。如果说刚才是一个人向后转,现在就是两个人一组跳交谊舞交换位置。你需要同时操作 4 个指针!

准备好挑战一下你的逻辑清晰度了吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 12:02:09

为什么你的C#网络程序总是丢包?彻底搞懂底层协议栈工作原理

第一章&#xff1a;为什么你的C#网络程序总是丢包&#xff1f;彻底搞懂底层协议栈工作原理当你在C#中使用TcpClient或UdpClient进行网络通信时&#xff0c;看似简单的Send和Receive调用背后&#xff0c;其实涉及复杂的操作系统协议栈处理流程。许多开发者遇到数据丢失、延迟高或…

作者头像 李华
网站建设 2026/4/29 0:31:55

狱内罪犯危险性评估系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着监狱管理信息化需求的日益增长&#xff0c;传统的人工评估方式已难以满足对罪犯危险性高效、精准判断的要求。狱内罪犯危险性评估系统的开发旨在通过智能化手段提升评估效率&#xff0c;减少人为误差&#xff0c;为监狱管理提供科学依据。该系统通过整合罪犯行为数据、…

作者头像 李华
网站建设 2026/4/16 19:36:48

微博大V用HeyGem发布AI播报每日热点新闻

微博大V用HeyGem发布AI播报每日热点新闻 在信息爆炸的今天&#xff0c;微博大V们每天都面临着一个现实挑战&#xff1a;如何在保证内容质量的前提下&#xff0c;持续输出大量视频内容&#xff1f;传统方式下&#xff0c;一条几分钟的新闻播报视频&#xff0c;从撰写脚本、录制配…

作者头像 李华
网站建设 2026/4/30 14:07:00

搜狗号内容创作者尝试AI数字人表达新形式

搜狗号内容创作者尝试AI数字人表达新形式 在内容为王的时代&#xff0c;搜狗号等平台上的创作者每天都面临一个现实困境&#xff1a;如何在有限时间内&#xff0c;持续产出高质量、有视觉吸引力的视频内容&#xff1f;真人出镜需要布光、拍摄、剪辑&#xff0c;流程繁琐&#x…

作者头像 李华
网站建设 2026/4/18 9:53:49

Docker Compose一键部署HeyGem数字人系统脚本分享

Docker Compose一键部署HeyGem数字人系统脚本分享 在内容创作日益智能化的今天&#xff0c;越来越多企业与个人开始尝试用AI生成“会说话的数字人”来制作课程讲解、产品宣传或虚拟主播视频。然而&#xff0c;大多数开源数字人项目虽然功能强大&#xff0c;却对使用者的技术门…

作者头像 李华
网站建设 2026/4/30 11:39:44

[精品]基于微信小程序的 食堂点餐系统UniApp

关注博主迷路&#xff0c;收藏文章方便后续找到&#xff0c;以防迷路&#xff0c;最下面有联系博主 系统截图展示 项目编号&#xff1a;031 详细视频演示 文章底部名片&#xff0c;联系我看更详细的演示视频 技术栈和所需工具 小程序端运行软件 微信开发者工具/hbu…

作者头像 李华