链表算法学习总结:反转链表与快慢指针(Java)

一、为什么链表题离不开指针技巧?

链表和数组最大的区别在于:链表无法通过下标随机访问,只能通过指针逐个遍历节点。
因此,大多数链表算法的核心并不是“复杂逻辑”,而是指针之间的关系变化

本次主要总结两个最常见、也是最重要的技巧:

  • 反转链表
  • 快慢指针

二、反转链表:从指针关系入手

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