快慢指针算法可在O(n)时间、O(1)空间内检测链表环,需严格初始化双指针于head、先空检查再移动、循环中先移后判且fast必须完整走两步,相对速度为1保证必相遇,常见错误是空指针未检、提前比较、循环条件不全。

快慢指针算法能在O(n)时间、O(1)空间内完成检测,无需遍历两次,也无需哈希表——真正实现“秒级”判断。关键不在速度多快,而在于逻辑简洁、边界清晰、一次到位。
初始化必须严格规范
两个指针都从 head 节点出发(不是 head->next),且必须先做空检查:
- 若 head == nullptr 或 head->next == nullptr,直接返回 false
- 否则令 slow = head,fast = head
移动与判断顺序不能颠倒
循环中必须先移动、后比较,且 fast 的移动要完整执行两步:
- 每次循环:slow 走 1 步 → fast 走 2 步(即 fast = fast->next->next)
- 移动完成后,再判断 slow == fast
- 循环条件是 fast != nullptr && fast->next != nullptr,缺一不可,否则会解引用空指针
为什么一定能相遇?不是靠运气
只要存在环,快慢指针必然相遇,原因在于相对速度恒为 1:
- 快指针每轮比慢指针多走 1 个节点,相当于以“1 节点/轮”的速度追赶
- 设二者进入环时距离为 d(d ≥ 1),最多 d 轮后必重合
- 若快指针走 3 步、慢指针走 1 步,相对速度为 2,可能因环长和初始距离奇偶性错失相遇
常见误判点就这三处
90% 的错误来自以下任一疏忽:
- 没检查 head 或 head->next 是否为空,导致单节点链表误判为有环
- 在移动前就比较 slow == fast,头节点就相等,直接返回 true
- while 条件只写 fast != nullptr,漏掉 fast->next != nullptr,访问非法内存

















