Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
sol:定义fast,slow指针,fast一次走两步,slow一次走一步,如果fast与slow相等,那么说明有环,如果是走到了NULL说明没有环。
code:
/**
* 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)
{
ListNode *fast,*slow;
if(head==NULL) return false;
fast=slow=head;
while(fast->next!=NULL&&fast->next->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow) break;
}
if(fast->next==NULL||fast->next->next==NULL) return false;
else return true;
}
};
pro:寻找链表中的环
sol:首先需要判断是否有环,方法同上:定义fast,slow指针,fast一次走两步,slow一次走一步,如果fast与slow相等,那么说明有环,如果是走到了NULL说明没有环。
第二步,将fast重新设置为head,slow不动,fast和slow这次都是一步步走,相遇的点就是环的起点。
code:
class Solution
{
public:
ListNode *detectCycle(ListNode *head)
{
if(head==NULL) return head;
ListNode *fast,*slow;
fast=slow=head;
while(fast->next!=NULL&&fast->next->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow) break;
}
if(fast->next==NULL||fast->next->next==NULL) return NULL;
fast=head;
while(fast!=slow)
{
fast=fast->next;
slow=slow->next;
}
return fast;
}
};