题意:给定一个链表,判断链表中是否有环。
思路一:使用哈希表记录访问次数,如果链表节点重复访问则链表中有环。
bool hasCycle(ListNode *head) {
unordered_map<ListNode*,int>mp;
ListNode *p=head;
while(p!=NULL){
if(mp.find(p)==mp.end()){
mp[p]=1; //初次访问,加入哈希表中。
}else{
mp[p]++; //访问次数加1
}
if(mp[p]>1) return true;
p=p->next;
}
return false;
}
思路二:使用双指针:快慢指针
快指针每次走两步,慢指针每次走一步,如果链表中有环,那么快指针会在环形链表行走中等于慢指针。类似于圆形操场,速度快的多跑一圈最后又赶上速度慢的。
bool hasCycle(ListNode *head) {
ListNode *fast,*slow;
fast=slow=head;
while(fast!=NULL&&fast->next!=NULL){
fast=fast->next->next;
slow=slow->next;
if(slow==fast&&slow!=NULL)
return true;
}
return false;
}