题目:
一个链表中包含环,如何找出环的入口结点。
ListNode *MeetingNode(ListNode *head)//找出环中的一个结点,利用快慢指针来实现;
{
if (head == NULL)
return NULL;
ListNode *slow = head->next;
ListNode *quick = head->next;
if (slow == NULL)
return NULL;
while (quick != NULL&&slow != NULL)
{
if (quick == slow)
return quick;
slow = slow->next;
quick = quick->next;
if (quick != NULL)
{
quick = quick->next;
}
}
return NULL;
}
ListNode *EntryNodeOfLoop(ListNode *pHead)//
{
ListNode *meetingNode = MeetingNode(pHead);
ListNode *pNode1 = meetingNode;
int numberOfLoop = 1;
while (pNode1->next != meetingNode)
{
pNode1 = pNode1->next;
numberOfLoop++;
}//求环中结点个数
pNode1 = pHead;
for (int i = 0; i < numberOfLoop; i++)
pNode1 = pNode1->next;
ListNode *pNode2 = pHead;
while (pNode1 != pNode2)
{
pNode1 = pNode1->next;
pNode2 = pNode2->next;
}
return pNode1;
}