題目描述
一個鏈表中包含環,請找出該鏈表的環的入口結點。
//鏈表中環的入口結點
//確定是否有環:兩指針一快一慢,如果能遇到,說明有環
//確定環內結點個數:從兩指針遇到開始計數,再次遇到即是環內結點個數
#include <iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
int isCircle(ListNode* pHead)
{
int num=0;
if(pHead==NULL||pHead->next==NULL)
return num;
ListNode *p,*q;
p=pHead;
q=p->next->next;
while(p!=q&&q!=NULL&&q->next!=NULL)
{
p=p->next;q=q->next->next;
}
if(p!=q)
return num;
else
{
p=p->next;q=q->next->next;
num++;
while(p!=q)
{
num++;
p=p->next;
q=q->next->next;
}
return num;
}
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==NULL||pHead->next==NULL)
return NULL;
int num=isCircle(pHead);
if(num==0)
return NULL;
else
{
ListNode *p,*q;
p=q=pHead;
while(num)
{
q=q->next;
num--;
}
while(q!=p)
{
q=q->next;
p=p->next;
}
return p;
}
}
void main()
{
ListNode no1(1),no2(2),no3(3),no4(4),no5(5),no6(6),no7(7);
no1.next=&no2;
no2.next=&no1;
//no3.next=&no4;
//no4.next=&no5;
//no5.next=&no6;
//no6.next=&no4;
ListNode* node=EntryNodeOfLoop(&no1);
if(node!=NULL)
cout<<node->val;
else
cout<<0;
system("pause");
}