算法与AI · 知识点深化 · 数据结构
链表反转与技巧:哑节点、快慢指针、环检测
链表题看着简单,指针一绕就错。反转链表是必考题,哑节点统一头节点处理,快慢指针找中点、判环、找倒数第 k 个。这一页把链表高频套路讲透。
① 怎么学(4 步走,约 60 分钟)
先建立直觉再抠细节,按这四步走最稳:
1看图建立直觉(10 分钟)
读②③:先在脑子里画出本课核心结构图。
2记完整体系(15 分钟)
读④:把对比表和公式看懂,不要急着背。
3跟例题走一遍(20 分钟)
精读⑤:看三个例题怎么用知识点解题。
4刷题纠错(剩余时间)
做⑦⑩,错题回⑥诊断。
本课小目标学完你要能:① 手写反转链表;② 用哑节点简化;③ 快慢指针三类用法;④ 判环找入口。
② 一图看懂:链表技巧全景
读法:中心是本课主题,四条分支展开核心维度,下方是典型应用与高频易错点。
③ 本质直觉:链表就是"手拉手找下一个"
链表每个节点存 val 和 next 指针。问题在于改 next 之前要先存好下一个节点,否则链就断了。
反转:用 prev/curr/next 三指针。每次让 curr.next 指向 prev,然后三个指针前移。
哑节点:在 head 前面加一个 dummy,所有操作都有前驱,不用单独处理头节点。
快慢指针:快的一次走两步,慢的一步。快到终点慢正好在中点;相遇说明有环。
判环找入口快慢相遇后,一个指针回 head,两个同步走,相遇点就是环入口。
④ 完整知识体系
高频技巧
| 技巧 | 解决问题 | 时间 |
| 哑节点 | 头节点可能变化 | O(n) |
| 三指针反转 | 反转链表 | O(n) |
| 快慢指针 | 找中点 | O(n) |
| 快慢判环 | 有没有环 | O(n) |
| Floyd | 找环入口 | O(n) |
迭代反转prev=null; while(curr){next=curr.next; curr.next=prev; prev=curr; curr=next}
找中点fast=head; while(fast && fast.next){slow=slow.next; fast=fast.next.next}
为什么要先存 next
curr.next = prev 之后,原来的 curr.next 就丢了。所以要先 next = curr.next 存下来。
⑤ 应用场景与例题
例1 反转链表 1->2->3->4
prev=null。1.next=null; 2.next=1; 3.next=2; 4.next=3。结果 4->3->2->1。
例2 找链表中点
fast 走两步 slow 一步。fast 到尾 slow 在中点。偶数个时 slow 在后半段开头。
例3 有环链表找入口
快慢相遇后,一个回 head,同步同速走,再次相遇就是入口。
做题心法改 next 前先存下一个;需要前驱就上哑节点。
⑥ 高频错误诊断(4 条)
错误1:改 next 前没存 next链断了,后面节点丢了。
错误2:不用哑节点处理头节点变化删除/反转头节点要单独判断,容易漏。
错误3:找中点 fast 越界while(fast && fast.next) 判空。
错误4:判环相遇直接当入口相遇点不是入口,要再走一遍。
⑦ 考点真题演练(5 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 反转 | 问时间复杂度 | O(n) |
| 哑节点 | 问作用 | 统一头节点处理 |
| 快慢 | 问找中点 | fast两步slow一步 |
| 环 | 问入口怎么找 | Floyd |
真题basic1. 反转链表的时间复杂度?
真题mid2. 反转链表时为什么要先存 next?
真题mid3. 快慢指针找中点,fast 走几步?
真题hard4. 快慢指针相遇后找环入口,正确做法?
真题hard5. 哑节点 dummy 的作用是?
⑧ 必背知识点卡
反转:prev/curr/next 三指针 先存 next
哑节点:head 前加 dummy 统一边界
找中点:fast 两步 slow 一步
判环:快慢相遇有环
环入口:相遇后回 head 同速走
倒数 k:fast 先走 k 步再同步
合并:两个 dummy 比较接小者
⑨ 动手输出:手写反转链表
场景:面试白板写反转。
① 初始化:prev=null, curr=head。
② 循环:next=curr.next 存下一个。
③ 反转:curr.next=prev。
④ 前移:prev=curr, curr=next。
⑤ 返回:prev 是新头。
口述思路先存 next 再反转,最后 prev 是新头。
⑩ 分层练习(基础 + 中档 + 拔高)
▍基础 6 题
基础1反转链表用几个指针?
三个 prev/curr/next。
基础5倒数第 k 个怎么找?
fast 先走 k 步。
▍中档 5 题
中档1为什么改 next 前存 next?
否则后续链丢失。
中档2偶数节点中点在哪个?
slow 在后半段开头。
中档3删除倒数第 n 个节点?
fast 先走 n+1 步再同步。
中档4环入口数学原理?
相遇后 head 到入口距离=相遇点到入口。
中档5合并两个有序链表?
dummy 接较小者。
▍拔高 5 题
拔高1递归反转链表怎么写?
reverse(head.next) 后接 head.next.next=head。
拔高2链表有环怎么求环长?
相遇后再走一圈计数。
拔高3回文链表怎么判断?
快慢找中点,反转后半段比较。
拔高4两个链表相交找交点?
走到头后换到对方头,相遇即交点。
拔高5K 个一组反转?
计数 k 个反转,递归下一组。
⑪ 记忆口诀 + 7 天复习计划
三句口诀① 三指针反转先存 next,哑节点统一边界。② 快慢两步找中点,相遇有环再找入口。③ 倒数 k 先让 fast 走 k 步。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,手写反转代码 | 三指针写对 |
| 第 2 天 | 背技巧表 + 基础 6 题 | 套路记住 |
| 第 3 天 | 做中档 5 题,写找中点 | 边界对 |
| 第 4 天 | 做拔高 5 题,写环入口 | 数学理解 |
| 第 5 天 | 做⑦真题 5 题 | 限时每题 5 分钟 |
| 第 6-7 天 | 合书白板写反转 | 不看资料 |
← 返回算法与AI总览