一個鏈表中環的入口
阿新 • • 發佈:2017-08-30
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; }
一個鏈表中環的入口