一、为什么链表题离不开指针技巧?
链表和数组最大的区别在于:链表无法通过下标随机访问,只能通过指针逐个遍历节点。
因此,大多数链表算法的核心并不是“复杂逻辑”,而是指针之间的关系变化。
本次主要总结两个最常见、也是最重要的技巧:
- 反转链表
- 快慢指针
二、反转链表:从指针关系入手
1. 核心思想
反转链表的本质是:改变节点之间 next 指针的指向关系。
经典做法是使用三个指针:
pre:当前处理节点的前一个节点cur:当前处理的节点next:用于暂存cur原来的下一个节点
每一轮循环只做一件事:
让
cur.next指向pre
循环结束后:
pre指向新的链表头cur指向null
2. 常见易错点
- 在修改
cur.next之前,一定要先保存原来的 next - 循环结束条件是
cur == null - 新的链表头是
pre,而不是原来的head
3. 反转链表的扩展应用
反转链表不仅是单独的一道题,还常用于:
- 判断回文链表
- 从中间节点开始反转链表
- 配合快慢指针拆分链表
三、快慢指针:用“速度差”解决定位问题
1. 查找链表中间节点
通过两个指针:
slow:每次走一步fast:每次走两步
当 fast 到达链表末尾时,slow 正好位于中间节点。
这种方法可以在 一次遍历内 找到中间节点,非常高效。
2. 环形链表判定
如果链表存在环:
- 快指针和慢指针一定会在环内相遇
- 如果不存在环,快指针会先到达
null
这是判断链表是否成环的经典方法。
四、总结
链表题的关键在于:
- 准确定义每个指针的含义
- 在纸上演化指针变化的情况
- 修改 next 时格外注意防止丢失原本的 next
五、相关代码
本文相关代码与学习笔记已同步至 GitHub:
https://github.com/tingfeng-work/algorithm-learning/tree/main/linkedList