您的位置:首页 > 职场人生

面试题:链表中环的入口节点

2018-01-29 22:59 267 查看
如果一个链表包含环,如何找出环的入口节点?

思路:显然是借鉴了上一题的套路,双指针就是答案。分析一下这个题目,首先,要确定有个环,再确定入口。再确定有没有环的同时还能得到环的大小的话,入口节点就好办了。

ListNode* MeetingNode(ListNode* pHead)

{

 if(pHead=nullptr)

  return nullptr;

ListNode* pSlow=pHead->m_pNext;
if(pSlow==nullptr)
 return nullptr;
ListNode* pFast=pSlow->m_pNext;
while(pFast!=nullptr&&pSlow!=nullptr)
{
 if(pFast=pSlow)

 return
pFast;
 pSlow=pSlow->m_pNext;

pFast=pFast_>m_pNext;
if(pFast!=nullptr)
 pFast=pFast->m_pNext;

}
return nullptr;
}

ListNode* EntryNodeOfLoop(ListNode* pHead)

{

 ListNode* meetingNode=MeetingNode(pHead);

if(meetingNode==nullptr)
 return nullptr;

int nodesInLoop=1;
ListNode* pNode1=meetingNode;
while(pNode1->m_pNext!=meetingNode)
{
 pNode1=pNode1->m_pNext;

++nodesInLoop;
}
pNode1=pHead;
for(int i=0;i<nodesInLoop;++i)
 pNode1=pNode1->m_pNext;

 ListNode* pNode2=pHead;

while(pNode1!=pNode2)
{
 pNode1=pNode1->m_pNext;

pNde2=pNode2->m_pNext;
}
return pNode1;
}

总结:来两个指针,一个快的,执行一次走两步,一个慢的,执行一次走一步,如果这个链表有环的话,那么在足够多次的循环后必然相撞。这个相撞的地点必然是环中一处,那么再来一轮循环,不过是从刚刚那个地方开始,计数,直到回到那点,这时能够得到环的大小。这个时候,再来两个指针,一先一后,先的那个先走环的大小,然后同步走,最终碰撞点就是入口点。这也是有指针才好操作的,所以上面的代码我理解后并没有检验过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: