1. 快慢指针算法概述
快慢指针(Fast-Slow Pointers)是链表操作中的经典技巧,通过两个指针以不同速度遍历链表来解决特定问题。这个算法最著名的应用就是检测链表中是否存在环,其时间复杂度为O(n),空间复杂度仅为O(1),相比哈希表等方案具有显著优势。
我第一次在实际工程中用到这个算法是在处理一个用户行为分析系统时。系统需要检测用户操作路径是否形成了循环引用(比如A→B→C→A这样的闭环),当时尝试了几种方案后,发现快慢指针无论在性能还是实现简洁性上都堪称完美。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环检测的基本原理
2.1 算法执行过程
标准的快慢指针环检测算法遵循以下步骤:
- 初始化两个指针:slow和fast,都指向链表头节点
- 开始循环遍历:
- slow每次移动1步(slow = slow.next)
- fast每次移动2步(fast = fast.next.next)
- 终止条件判断:
- 如果fast遇到null(fast == null或fast.next == null),说明链表无环
- 如果fast == slow,说明链表有环
python复制def hasCycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if fast == slow:
return True
return False
2.2 数学原理剖析
为什么这个算法能工作?关键在于两个指针的速度差。假设链表有环,快指针最终会从后面追上慢指针,就像在环形跑道上赛跑一样。
具体来说:
- 设环外长度为L,环长度为C
- 当slow进入环时,fast已经在环中某位置,设此时两者距离为d(0 ≤ d < C)
- 由于fast每次比slow多走1步,相当于fast以相对速度1向slow靠近
- 经过(C-d)次迭代后,两者必然相遇
这个原理也解释了为什么快指针要走2步而不是其他步数。步数差为1可以确保一定能相遇,而更大的步数差可能导致指针"跳过"彼此。
