题目描述
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
样例输入
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1 输出:false 解释:链表中没有环。
提示:
- 链表中节点的数目范围是
[0, 104]
-105 <= Node.val <= 105
pos
为-1
或者链表中的一个 有效索引 。
题解
哈希解
遍历链表每一个节点,并使用哈希表进行标记,判断该节点是否被遍历过,如果被遍历过则说明链表中有换
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> seen;
ListNode* pos=head;
while(pos)
{
if(seen.find(pos)!=seen.end())
return true;
seen.insert(pos);
pos=pos->next;
}
return false;
}
};
快慢指针解
使用快慢指针法
- 如果链表中没有环,则当遍历结束时,快指针必然不会与慢指针相遇
- 否则快指针必然先一步进入环形,慢指针也会进入环形,由于快指针走的快,因此在环形中编历时,快指针一定会与慢指针相遇
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head || !head->next) return false;
ListNode* low=head,*fast=head->next;
while(fast!=low)
{
if(!fast || !fast->next) return false;
low=low->next;
fast=fast->next->next;
}
return true;
}
};