题目描述:给你一个链表的头节点 head ,判断链表中是否有环。
方法1:慢指针每次移动一步,快指针每次移动两步,如果有环最后一定会相遇
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head || !head->next) return false; //处理没有节点或者只有一个节点,注意是非
ListNode *p = head;//快指针
ListNode *q = head;//慢指针
while(p && p->next){//无环时,奇数个节点,p为空,偶数个节点,p->next为空
p = p->next->next;
q = q->next;
if(p == q) return true;
}
return false;
}
};
方法2:使用unordered_set
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> set;
while(head){
if(set.count(head)) return true;
set.emplace(head);
head = head->next;
}
return false;
}
};