141. Linked List Cycle
题目大意
Given head
, the head of a linked list, determine if the linked list has a cycle in it.
There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos
is used to denote the index of the node that tail’s next pointer is connected to. Note that pos
is not passed as a parameter.
Return true
if there is a cycle in the linked list. Otherwise, return false
.
中文释义
给定 head
,一个链表的头节点,判断这个链表是否有环。
如果链表中有一些节点可以通过不断跟随 next
指针再次到达,则链表中存在环。在内部,pos
用于表示尾节点的 next
指针连接到的节点的索引。注意 pos
不作为参数传递。
如果链表中存在环,则返回 true
。否则,返回 false
。
示例
Example 1:
Input: head = [3,2,0,-4]
, pos = 1
Output: true
Explanation: 链表中存在一个环,其中尾部连接到第 1 个节点(0 索引)。
Example 2:
Input: head = [1,2]
, pos = 0
Output: true
Explanation: 链表中存在一个环,其中尾部连接到第 0 个节点。
Example 3:
Input: head = [1]
, pos = -1
Output: false
Explanation: 链表中不存在环。
限制条件
- 链表中节点的数目范围是 [0, 104]。
- -105 <= Node.val <= 105
pos
为 -1 或者链表中的一个有效索引。
进阶问题
你能否使用 O(1)(即常数)内存解决此问题?
解题思路
方法
即判断给定的链表 head
是否含有环。这种方法使用快慢指针的技巧,其中慢指针每次移动一个节点,快指针每次移动两个节点。
-
初始化快慢指针:
- 创建两个指针
slow
和fast
,都初始化为指向头节点head
。
- 创建两个指针
-
遍历链表:
- 使用一个循环来移动快慢指针,直到
fast
或者fast->next
为nullptr
(这表示到达链表末尾,没有环):- 慢指针
slow
每次向前移动一个节点。 - 快指针
fast
每次向前移动两个节点。 - 如果快慢指针相遇(即
slow == fast
),则表示链表中有环,返回true
。
- 慢指针
- 使用一个循环来移动快慢指针,直到
-
检测环:
- 如果快指针到达链表末尾(即
fast
为nullptr
或fast->next
为nullptr
),则表示链表中没有环,返回false
。
- 如果快指针到达链表末尾(即
代码
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
return true; // 发现环
}
}
return false; // 链表没有环
}
};