一个链表中环的入口

Posted 泡面小王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个链表中环的入口相关的知识,希望对你有一定的参考价值。

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

思路:

第一步,找环中相汇点。分别用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; 

    }

 

以上是关于一个链表中环的入口的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-链表中环的入口结点

链表中环的入口结点

链表中环的入口结点

链表中环的入口结点

链表中环的入口

剑指Offer对答如流系列 - 链表中环的入口节点