思路
1.设置一个快指针、一个慢指针,两个指针同时遍历链表,只不过快指针采取跳跃式遍历,即访问的下一个元素是其next的next元素,慢指针访问的下一个元素是其next元素。
2.每一次迭代时,快指针比慢指针遍历速度多了一个元素,那么如果存在环的话,快指针是可以重新出现在慢指针后面,在某一个时刻快指针等于慢指针。如果不存在环的话,快指针可以遍历到链表尾部。
代码
/**
* 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||!head->next)
{
return false;
}
ListNode *slow=head;
ListNode *fast=head->next;
while(fast!=slow)
{
if(fast==NULL||fast->next==NULL)
return false;
fast=fast->next->next;
slow=slow->next;
}
return true;
}
};