您的位置:首页 > 其它

链表中环形的入口

2015-12-08 15:18 363 查看

【题目描述】

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

【解题思路】



有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。
  那么问题来了,如何判断一个链表是不是这类链表?如果链表为存在环,如果找到环的入口点?   当fast若与slow相遇时,slow肯定没有走遍历完链表(不是一整个环,有开头部分,如上图)或者恰好遍历一圈(未做验证,看我的表格例子,在1处相遇)。于是我们从链表头、相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点(慢指针走了n步,第一次相遇在c点,对慢指针来说n=s+p,也就是说如果慢指针从c点再走n步,又会到c点,那么顺时针的CB距离是n-p=s,但是我们不知道s是几,那么当快指针此时在A点一步一步走,当快慢指针相遇时,相遇点恰好是圆环七点B(AB=CB=s))。
【代码实现】

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==NULL)
return NULL;
ListNode* pAhead=pHead;
ListNode* pBehind=pHead;
while(pAhead!=NULL&&pAhead->next!=NULL)
{
pAhead=pAhead->next->next;
pBehind=pBehind->next;
if(pAhead==pBehind)
break;
}

if(pAhead==NULL||pAhead->next==NULL)
return NULL;

pAhead=pHead;
while(pAhead!=pBehind)
{
pAhead=pAhead->next;
pBehind=pBehind->next;
}
return pBehind;//return pAhead;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: