1. 程式人生 > >一個鏈表中環的入口

一個鏈表中環的入口

space pac nod spl 快慢指針 nbsp tno float return

一個鏈表中包含環,請找出該鏈表的環的入口結點。

思路:

第一步,找環中相匯點。分別用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; }

一個鏈表中環的入口