原题链接:https://leetcode.cn/problems/linked-list-cycle/?favorite=2cktkvj
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
示例 1:
![](https://i-blog.csdnimg.cn/blog_migrate/93ad7a0dea18905f678dfae04d024da7.png)
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
![](https://i-blog.csdnimg.cn/blog_migrate/c381b5fcac0039628ee3f99ce7897f81.png)
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
![](https://i-blog.csdnimg.cn/blog_migrate/a4d5738ef201d54994956866f0d91b3d.png)
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解法一:无序哈希表
利用无序哈希表存入每次不同的节点,并判断此节点没有重复计数过,那么就没有环;反之,则有。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> p; //声明一个无序哈希表
while(head != nullptr){ //如果节点不为空
if(p.count(head)){ //在哈希表内有相同的节点
return true; //返回 true
}
p.insert(head); //向p中加入节点
head = head->next; //将节点移向下一位
}
return false;
}
};
解法二:快慢指针
利用无序哈希表存入每次不同的节点,并判断此节点没有重复计数过,那么就没有环;反之,则有。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == nullptr || head->next == nullptr ) return false; //判断快慢节点与节点下一个是否为空
ListNode * fast = head -> next; //定义一个快指针
ListNode* slow = head; //定义一个慢指针
while(slow!=fast){ //慢指针不等于快指针则继续循环
if(fast == nullptr || fast -> next == nullptr){ //如果快指针为空或下一位为空,则判定没有环
return false;
}
fast = fast->next->next; //快指针前进两位
slow = slow->next; //慢指针前进一位
}
return true; //如果退出循环则
}
};