鏈表中環形的入口


【題目描述】

一個鏈表中包含環,請找出該鏈表的環的入口結點。
 
【解題思路】
    有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是鏈表中在它之前的節點,這樣在鏈表的尾部形成一環。
  那么問題來了,如何判斷一個鏈表是不是這類鏈表?如果鏈表為存在環,如果找到環的入口點?    當fast若與slow相遇時,slow肯定沒有走遍歷完鏈表(不是一整個環,有開頭部分,如上圖)或者恰好遍歷一圈(未做驗證,看我的表格例子,在1處相遇)。於是我們從鏈表頭、相遇點分別設一個指針,每次各走一步,兩個指針必定相遇,且相遇第一點為環入口點(慢指針走了n步,第一次相遇在c點,對慢指針來說n=s+p,也就是說如果慢指針從c點再走n步,又會到c點,那么順時針的CB距離是n-p=s,但是我們不知道s是幾,那么當快指針此時在A點一步一步走,當快慢指針相遇時,相遇點恰好是圓環七點B(AB=CB=s))。
【代碼實現】
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6         val(x), next(NULL) {
 7     }
 8 };
 9 */
10 class Solution {
11 public:
12     ListNode* EntryNodeOfLoop(ListNode* pHead)
13     {
14         if(pHead==NULL)
15             return NULL;
16         ListNode* pAhead=pHead;
17         ListNode* pBehind=pHead;
18         while(pAhead!=NULL&&pAhead->next!=NULL)
19         {
20             pAhead=pAhead->next->next;
21             pBehind=pBehind->next;
22             if(pAhead==pBehind)
23                 break;
24         }
25 
26         if(pAhead==NULL||pAhead->next==NULL)
27             return NULL;
28 
29         pAhead=pHead;
30         while(pAhead!=pBehind)
31         {
32             pAhead=pAhead->next;
33             pBehind=pBehind->next;
34         }
35         return pBehind;//return pAhead;
36     }
37 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM