您的位置:首页 > 其它

链表中环的入口结点

2016-04-25 18:26 211 查看

链表中环的入口结点

一个链表中包含环,请找出该链表的环的入口结点。

对于找相遇点的问题,“快慢”指针是一个很好的突破口,在这个问题描述中如果我们知道环中结点的个数n:便很好的可以利用”快慢“的性质,如定义P1,P2两个指针,P2先移动n个结点,然后P1,P2一起移动,则相遇的结点就是我们所求的入口结点。(P2移动的结点数-P1移动的结点数=n)

环中个数的求解:

同理采用“快慢”指针的思想,定义指针P1,P2,假设P2的移动速度是P1的两倍,因为链表中存在环,所以P1和P2肯定在环中相遇,记录该结点,动态维护一个移动值i,P1继续移动到该结点时,移动值i为该环的个数

具体AC代码如下:

public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode p1=pHead;
ListNode p2=pHead;
int n=getNodeOfLoop(pHead);
if(n==-1)
return null;
for(int i=0;i<n;i++)
{
p1=p1.next;
}
while(p1!=p2)
{
p1=p1.next;
p2=p2.next;
}
return p1;
}
private int getNodeOfLoop(ListNode pHead)//-1表示不存在环;
{
if(pHead==null)
return -1;
ListNode p1=pHead.next;
if(p1==null)
return -1;
ListNode p2=pHead.next.next;
while(p1!=null&&p2!=null&&p1!=p2)
{
p1=p1.next;
p2=p2.next.next;
} //当P1=P2时跳出循环依次移动获取环中结点个数
ListNode p3=p2.next;;
int numOfLoop=1;
while(p3!=p1)
{
p3=p3.next;
numOfLoop++;
}
return numOfLoop;
}


总结:

其实通过此题可以衍生很多类似的问题,例如如何判断两个链表是否相交,以及如何求出相交的结点等等问题都可以采用”快慢指针”的思想。希望可以通过此题的分析可以帮助读者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 指针