1. 快慢指针算法基础解析
快慢指针是链表操作中的经典技巧,由Robert W. Floyd在1967年提出,最初用于检测单向链表中的循环。这个算法的精妙之处在于仅使用两个指针变量就能解决看似复杂的问题,空间复杂度仅为O(1)。
快指针(fast)通常每次移动两个节点,慢指针(slow)每次移动一个节点。当两者相遇时,可以确定链表中存在环。这个原理类似于两个人在环形跑道上跑步,速度快的人最终会追上速度慢的人。
python复制class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def hasCycle(head: ListNode) -> bool:
if not head or not head.next:
return False
slow = head
fast = head.next
while slow != fast:
if not fast or not fast.next:
return False
slow = slow.next
fast = fast.next.next
return True
注意:初始时fast从head.next开始是为了避免第一次循环就立即匹配的情况。这是算法实现中容易忽略的细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 重置指针的核心逻辑剖析
2.1 重置时机的判断标准
当快慢指针首次相遇时,说明链表中存在环,但此时我们往往需要进一步操作,比如找出环的起点。这时就需要重置其中一个指针的位置。常见的重置策略有两种:
- 将快指针重新指向链表头部
- 将慢指针保持原位,快指针改为每次移动一步
这两种策略的选择取决于具体问题需求。例如在寻找环起点的问题中,通常会选择第一种策略。
python复制def detectCycle(head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow =
