利扣141给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。+
时间: 2025-06-16 13:26:36 浏览: 19
### Floyd判圈算法(快慢指针法)实现链表环检测
Floyd判圈算法,也称为龟兔赛跑算法,是一种高效的判断链表中是否存在环的算法[^2]。该算法通过使用两个指针——一个慢指针和一个快指针,在链表上以不同的速度移动来检测环的存在。
#### 算法步骤
1. 初始化两个指针 `slow` 和 `fast`,均指向链表的头节点。
2. 慢指针每次移动一步,而快指针每次移动两步。
3. 如果链表中存在环,则快指针最终会追上慢指针,即两者相遇。
4. 如果链表中不存在环,则快指针会先到达链表末尾(即 `fast` 或 `fast.next` 为 `null`),此时可以确定链表无环。
#### 代码实现
以下是一个基于快慢指针法的 Python 实现:
```python
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def hasCycle(head: ListNode) -> bool:
slow, fast = head, head
while fast and fast.next:
slow = slow.next # 慢指针每次移动一步
fast = fast.next.next # 快指针每次移动两步
if slow == fast: # 如果快慢指针相遇,则说明存在环
return True
return False # 如果快指针到达链表末尾,则说明无环
```
上述代码中,`hasCycle` 函数实现了链表环检测的功能。如果链表中存在环,则返回 `True`;否则返回 `False`[^4]。
### 时间与空间复杂度分析
- **时间复杂度**:O(n),其中 n 是链表中的节点数。在最坏情况下,快指针需要遍历整个链表才能确定是否存在环。
- **空间复杂度**:O(1),因为只使用了两个额外的指针变量,而没有使用其他辅助数据结构[^3]。
### 哈希表解法对比
虽然可以通过哈希表记录访问过的节点来检测环,但这种方法的空间复杂度较高,为 O(n),因为需要存储每个访问过的节点。相比之下,快慢指针法在空间复杂度上更具优势[^3]。
阅读全文
相关推荐




















