题目描述
一个链表中包含环,请找出该链表的环的入口结点。
//链表中环的入口结点
//确定是否有环:两指针一快一慢,如果能遇到,说明有环
//确定环内结点个数:从两指针遇到开始计数,再次遇到即是环内结点个数
#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");
}