一个链表中环的入口

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

思路:

第一步,找环中相汇点。分别用slow,fast指向链表头部,slow每次走一步,fast每次走二步,直到slow==fast找到在环中的相汇点。

第二步,找环的入口。接上步,当slow==fast时,fast所经过节点数为2x,slow所经过节点数为x,设环中有n个节点,fast比slow多走一圈有2x=n+x;     n=x;可以看出slow实际走了一个环的步数,再让fast指向链表头部,slow位置不变,slow,fast每次走一步直到slow==fast;  此时slow指向环的入口。

ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead==NULL||pHead->next==NULL||pHead->next->next==NULL) return NULL;
        ListNode* slow=pHead;
        ListNode* fast=pHead;
        while(slow!=NULL&&fast->next!=NULL)
        {
            if(slow->next&&fast->next->next)//快慢指针的移动
            {
                slow=slow->next;//慢指针移动一步
                fast=fast->next->next;//快指针移动两步
                if(slow==fast)//如果快慢指针相遇,让慢指针不动,快指针指向指针头部
                {
                    fast=pHead;
                    while(fast!=slow)//快慢指针一起向后移动一步,直至相遇即为环入口节点
                    {
                       slow=slow->next;
                       fast=fast->next;
                    }
                    return slow;
                }
            }
            else
            {
                return NULL;
            }
        }
        return NULL; 

    }
原文地址:https://www.cnblogs.com/wft1990/p/7452792.html