在这里插入代码片
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
struct ListNode
{
ListNode * next ;
int x ;
ListNode(int x ):x(x),next(NULL)
{
}
};
bool hasCycle(ListNode * head)
{
ListNode *root = head;
if(root == NULL || root->next == NULL)
{
return 0;
}
else
{
ListNode * fast ,* slow;
fast = slow = root;
whilt( fast != NULL && slow != NULL && slow->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
if(fast == slow)
{
// 此时此刻 ,第一次重合,找环的起点:
// 让其中slow指针指向起点, fast指针不动,
// 然后两个指针每次都移动一步,
// 当slow指针移动a次指向循环起点时,
// fast指针刚好也指向循环起点
for(slow = head; slow != fast; slow = slow->next,fast = fast->next)
// 此时slow就是起点
;
return true;
// 如果需要找环的长度
}
printf("slow:%d,fast:%d\n",slow->x,fast->x);
}
return false;
}
}
面试问答
另外记录一个 写的比较完整的文章链接
https://www.cnblogs.com/geziyu/p/9903952.html