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

面试题(二十三) 链表中环的入口节点

2018-02-25 22:27 295 查看
题目:一个链表中包含环,请找出该链表的环的入口结点。

思路:关键是要想到:如果链表存在环,则设置一快一慢两个指针同时从链表头出发,那么快的指针必定会追上慢的指针,并且相遇的节点为环中的一个节点。然后再让指向相遇节点的指针绕着环一圈便可以计算出环的长度length。最后再让一个指针从链表头节点出发,另一个指针从链表的第length+1个节点出发,两个指针以相同速度往后移动,相遇的节点便为链表的环的入口节点。该思路过程体现了分解复杂问题为几个简单问题的思想。

代码(已在牛客网AC):

public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode meetingNode = meetingNode(pHead);
if(meetingNode == null)
return null;
// 计算环的长度
int circleLength = 1;
ListNode pNode1 = meetingNode;
while(pNode1.next != meetingNode)
{
circleLength++;
pNode1 = pNode1.next;
}
//寻找环的入口节点
ListNode pNode2 = pHead;
pNode1 = pHead;
// 注意两个指针的距离为环的长度
for(int i = 0; i < circleLength; i++)
pNode1 = pNode1.next;
while(pNode1 != pNode2)
{
pNode1 = pNode1.next;
pNode2 = pNode2.next;
}
return pNode1;
}

// 该函数用于寻找一快一慢指针在环中相遇的节点
private ListNode meetingNode(ListNode pHead)
{
if(pHead == null)
return null;
ListNode pSlow = pHead.next;
// 若链表只有一个节点,则无环
if(pSlow == null)
return null;

ListNode pFast = pSlow.next;
while(pFast != null && pSlow != null)
{
if(pFast == pSlow)
return pFast;
pSlow =
4000
pSlow.next;
if(pFast.next != null)
pFast = pFast.next.next;
}
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: