1. 环形链表问题概述
链表成环检测是数据结构与算法领域的经典面试题型,LeetCode第141题要求判断单链表是否存在环结构。这道题看似简单,却考察了程序员对链表结构的理解、算法设计能力以及对时间/空间复杂度的把控。
在实际工程中,环形链表检测算法常用于内存管理、资源调度等场景。比如操作系统需要检测进程间的循环等待以避免死锁,数据库系统要识别表连接中的循环引用。掌握这类算法能帮助开发者写出更健壮的代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心解法思路分析
2.1 暴力解法与哈希表法
最直观的解法是暴力遍历:使用双重循环检查每个节点是否被重复访问。这种方法时间复杂度O(n²),空间复杂度O(1),效率太低不适合实际应用。
改进方案是使用哈希表存储已访问节点:
python复制def hasCycle(head):
visited = set()
while head:
if head in visited:
return True
visited.add(head)
head = head.next
return False
时间复杂度O(n),空间复杂度O(n)。虽然效率提升,但需要额外存储空间。
2.2 快慢指针法解析
快慢指针(Floyd判圈算法)是更优解决方案:
python复制def hasCycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
算法原理:
- 慢指针每次移动1步,快指针移动2步
- 若无环,快指针会先到达终点(None)
- 若有环,快指针最终会追上慢指针(相遇)
数学证明:
设环前有k个节点,环长n。当慢指针进入环时,快指针已在环中移动了k步(位置k%n)。之后快指针每轮比慢指针多走1步,经过(n - k%n)次移动后必然相遇。
时间复杂度O(n),空间复杂度O(1),
