← 链表 · Linked List / 判环 · 找入口 · 量环长 待审核 9 / 14
cycle · Floyd 判圈

判环 · 找入口 · 量环长

单链表的每个节点只持有自己的 next 引用,无法回溯。判断它有没有(尾部指回中间某个节点),最朴素的办法是用 HashSet 记录走过的每个节点,遇到重复即有环——但需要 O(n)O(n) 额外空间。Floyd 判圈(龟兔赛跑) 只用两个指针、O(1) 空间:slow 一次一步、fast 一次两步,有环则两者必然在环里相遇。相遇之后还能进一步求出环入口环长

**为什么有环就一定相遇?**两个指针都进环后,把环看成一条环形跑道:fast 每步比 slow 多走 1 格,它们的「间距」每步减 1,必然归零——也就是相遇。fast 不会「跳过」slow,因为每次只逼近一格。无环则 fast 先到达 \emptyset,即可判定无环。

找入口的数学:设头到入口距离 a、入口到相遇点 b、环长 L。相遇时 slow 走 a+b、fast 走 2(a+b) 且多绕整数圈,推出 a=kLba = kL - b。所以让一个指针从、另一个从相遇点同速走,各走 a 步后恰好在入口重逢量环长更直接:从相遇点出发再绕一圈回到自己,数走了几步即是 L

双指针系列的 快慢指针 一页从「指针机制」角度同时覆盖判环、入口、中点、倒数第 k;本页专注环相关问题(判环 → 入口 → 环长),并补充环长的求法。