判断单链表是否有环的方法
时间: 2025-09-07 21:37:36 AIGC 浏览: 2
判断单链表是否有环的方法有以下几种:
#### 追及法(快慢指针法)
设置两个指针,一个是 `slow`,另一个是 `fast`。`slow` 一次走一个节点,`fast` 一次走两个节点,当 `fast` 追上 `slow` 即 `fast` 和 `slow` 重合时,说明链表中有环 [^4]。
以下是Python代码示例:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def hasCycle(head):
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
```
#### 哈希法
维护一个哈希表,遍历链表将每个节点的地址存入哈希表中,如果出现重复就代表链表有环 [^4]。
以下是Python代码示例:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def hasCycle(head):
visited = set()
while head:
if head in visited:
return True
visited.add(head)
head = head.next
return False
```
#### 标记法
遍历单链表,将经过的节点都做标记,采用的方法是将遍历的节点都放入集合 `visited` 中,对每个节点判定是否在集合中出现过,若出现重复访问,则判定有环。空间复杂度为 $O(n)$,时间复杂度为 $O(n^2)$ [^3]。
以下是Java代码示例:
```java
import java.util.ArrayList;
class Node {
int val;
Node next;
Node(int x) {
val = x;
next = null;
}
}
public class Main {
private static boolean methodSecond(Node head) {
ArrayList<Node> visited = new ArrayList<>();
while (head != null) {
if (visited.contains(head)) {
return true;
}
visited.add(head);
head = head.next;
}
return false;
}
}
```
#### 链表合并转化法
先遍历第一个链表到它的尾部,然后将尾部的 `next` 指针指向第二个链表(尾部指针的 `next` 本来指向的是 `null`),这样两个链表就合成了一个链表,判断原来的两个链表是否相交也就转变成了判断新的链表是否有环的问题 [^1]。
#### 反转链表法
反转链表时,会用到3个指针,分别为指向遍历时当前的结点的 `current` 指针,指向反转后的子链表的头结点的指针 `temp`,及指向遍历时当前结点的下一个结点的 `next` 指针,如果在反转时,出现了 `next` 指向头结点的情况,那么肯定是有环的 [^5]。
阅读全文
相关推荐


















