news 2026/4/23 14:28:11

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

作者头像

张小明

前端开发工程师

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/23 8:34:08

避开这3个常见陷阱,让你的Lambda代码健壮又高效

第一章&#xff1a;Lambda匿名函数的核心概念与作用 Lambda匿名函数是一种轻量级的函数定义方式&#xff0c;允许开发者在不显式命名函数的情况下快速创建可调用的代码块。它广泛应用于需要传递函数作为参数的场景&#xff0c;如排序、过滤和映射操作。由于其简洁的语法和即时执…

作者头像 李华
网站建设 2026/4/23 8:33:53

【C# 12新特性必学课】:顶级语句背后的编译器黑科技揭秘

第一章&#xff1a;C# 12顶级语句概述 C# 12 引入了更简洁的编程模型&#xff0c;其中顶级语句&#xff08;Top-level Statements&#xff09;成为默认项目模板的核心特性。开发者无需手动定义类或 Main 方法即可编写可执行程序&#xff0c;编译器会自动将顶级位置的代码视为程…

作者头像 李华
网站建设 2026/4/23 8:36:18

[精品]基于微信小程序的 校园跑腿小程序UniApp

文章目录项目实现效果图所需技术栈文件解析微信开发者工具HBuilderXuniappmysql数据库与主流编程语言登录的业务流程的顺序是&#xff1a;毕设制作流程系统性能核心代码系统测试详细视频演示源码获取项目实现效果图 项目编号&#xff1a;037 所需技术栈 小程序…

作者头像 李华
网站建设 2026/4/23 8:34:57

C#自定义通信协议实战(工业级帧结构设计与安全加密)

第一章&#xff1a;C#自定义通信协议的核心概念在分布式系统和网络编程中&#xff0c;通信协议是确保数据在客户端与服务端之间可靠传输的基础。使用 C# 构建自定义通信协议&#xff0c;开发者可以精确控制数据格式、传输机制和错误处理策略&#xff0c;从而满足特定业务场景的…

作者头像 李华
网站建设 2026/4/23 14:14:50

HeyGem数字人系统部署教程:如何在本地启动并运行AI视频生成工具

HeyGem数字人系统部署实践&#xff1a;从零搭建本地AI视频生成平台 在企业数字化转型浪潮中&#xff0c;内容生产效率正面临前所未有的挑战。一场5分钟的产品宣讲视频&#xff0c;传统流程需要策划、拍摄、配音、剪辑多个环节协同&#xff0c;耗时动辄数小时&#xff1b;而如今…

作者头像 李华
网站建设 2026/4/21 3:42:06

强烈安利!10款AI论文工具测评,本科生写毕业论文必备

强烈安利&#xff01;10款AI论文工具测评&#xff0c;本科生写毕业论文必备 2026年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的学术写作工具走进了高校学生的视野。对于本科生而言&#xff0c;撰写毕业论文不仅是一…

作者头像 李华