while(cur){
if(s.count(cur))//这个s.count()函数是判断该值是否存在(因为我们输入的是指针,所以一旦指针相等那么其后面的元素必相等,也就是出现了循环)
return cur;
s.insert(cur);
cur = cur->next;
}
return NULL;
}
};
[](()2:双指针
/**
-
Definition for singly-linked list.
-
struct ListNode {
-
int val;
-
ListNode *next;
-
ListNode(int x) : val(x), next(NULL) {}
-
};
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
/**
思路:
1.双指针 快慢指针(快指针一次一个结点,慢指针一次两个结点)
2.如果有环 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 的话,那么快慢指针肯定会相遇
3.那么相遇的地点一定在环中 因为如果没有环的话慢指针是永远追不到快指针的
4.接下来就是判断出口在那里,我们定义一个结点从头开始,还有一个结点是从fast结点开始 他俩相遇就是出口点
*/
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
//快慢指针相遇
if( slow == fast){
ListNode* temp1 = fast;
ListNode* temp2 = head;
// (快慢指针相等说明 其往后的结点均相等)
while (temp1 != temp2){
temp1 = temp1->next;
temp2 = temp2->next;
}
return temp2;
}
}
return NULL;