1. 核心思想
定义两个指针:
slow:每次走 1 步fast:每次走 2 步(有时根据题意调整)
通过两者的速度差,解决链表中的一些位置、环、相遇问题。
2. 适合哪些题目
(1)判断链表是否有环
典型题:
- 141. 环形链表
思路:
- 有环:快指针最终会追上慢指针
- 无环:快指针会走到
null
(2)找环的入口
典型题:
- 142. 环形链表 II
思路:
- 先用快慢指针判断是否相遇
- 相遇后再用一个新指针从头出发,和慢指针一起走
- 再次相遇的位置就是环入口
(3)找链表中点
典型题:
- 876. 链表的中间结点
思路:
fast一次两步,slow一次一步- 当
fast到终点时,slow正好在中间
(4)找倒数第 k 个节点
这题更常见是“前后指针”,但本质也属于双指针思想。
思路:
- 先让一个指针走
k步 - 然后两个指针一起走
- 当前指针到尾部时,后面的指针就是倒数第
k个
(5)判断链表是否为回文
典型题:
- 234. 回文链表
思路:
- 快慢指针先找中点
- 反转后半部分
- 两边一起比较
3. 常用模板
3.1 判断是否有环
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;