Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
// Source : https://oj.leetcode.com/problems/linked-list-cycle/
// Author : Chao Zeng
// Date : 2014-12-18
//判断一个链表是不是有环
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
if (!head)
return false;
else{
ListNode *p = head;
ListNode *q = head;
while (q && q->next){
p = p->next;
q = q->next->next;
if (p == q)
return true;
}
return false;
}
}
};
//寻找有环链表的入口点
ListNode *findLoopEntrance (ListNode *pHead){
ListNode *slow = pHead;
ListNode *fast = pHead;
while (fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break;
}
//一个node节点
if (fast == NULL || fast->next == NULL)
return NULL;
ListNode *first = pHead;
while (first != fast){
first = first->next;
fast = fast->next;
}
return fast;
}
//环的长度
int loopLength (ListNode *pHead){
if (!hasCycle(pHead))
return 0;
ListNode *fast = pHead;
ListNode *slow = pHead;
int length = 0;
bool flag1 = false;
bool flag2 = false;
while (fast || fast->next){
fast = fast->next->next;
slow = slow->next;
//第一圈结束,第二圈开始
if (fast == slow && flag1 == false)
flag1 = true;
//第二圈结束
if (fast == slow && flag2 == false)
break;
if (flag1)
length++;
}
return length;
}