- 判断链表是否有环
可用快慢指针的方法来判断。慢指针每走一步,快指针走两步,若两者能够相遇则有环。
/**
* 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=head;
ListNode* slow=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
return true;
}
return false;
}
- 判断链表是否有环,如果有环,返回环的入口
当两指针相遇时,让快指针重新返回head,并设其速度与慢指针相同为一步,两指针再次相遇点即为环当入口
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* hasCycle(ListNode* head)
{
ListNode* fast=head;
ListNode* slow=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
break;
else
return NULL;
}
fast=head;
while(fast!=slow)
{
fast=fast->next;
slow=slow->next;
}
return fast;
}
- 求环的长度
知道了环的入口,指针再次走到入口即为环的长度
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* hasCycle(ListNode* head)
{
ListNode* fast=head;
ListNode* slow=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
break;
else
return 0;
}
fast=fast->head;
while(fast!=slow)
{
fast=fast->next;
slow=slow->next;
}
ListNode* temp=fast;
int count=0;
while(fast->next!=temp)
{
fast=fast->next;
count++;
}
return count;
}