數據結構面試 之 單鏈表是否有環及環入口點 附有最詳細明了的圖解

1.限制與要求

  • 不允許修改鏈表結構。
  • 時間復雜度O(n),空間復雜度O(1)。

2.思考

2.1判斷是否有環

如果鏈表有環,那么在遍歷鏈表時則會陷入死循環,利用這個特征,我們可以設計這樣的算法。

  • 使用一個slow指針,一個fast指針。
  • slow指針一次往后遍歷以1個節點,fast指針一次往后遍歷2個節點,一直做這樣的操作。
  • 如果fast指針在遍歷過程中,遍歷到了NULL節點說明鏈表沒有環。
  • 否則當slow指針和falst指針相同,則說明環有節點。

2.2環的入口節點

我們假定鏈表頭到環入口的距離是len,環入口到slow和fast交匯點的距離為x,環的長度為R。slow和fast第一次交匯時,設slow走的長度為:d = len + x,而fast走的長度為:2d = len + nR + x,(n >= 1),從而我們可以得知:2len + 2x = len + nR + x,即len = nR - x,(n >= 1),于是我們可以得到這樣的算法。

  • 使用一個cur指針指向鏈表頭節點,一個inter指針指向第一次的交匯點。
  • cur指針和inter指針一起往后遍歷。
  • cur指針和inter指針相等時,cur和inter指針指向的就是環的入口節點。

inter指針在遍歷過程中可能多次(n >= 1)經過環入口節點,但當cur指針第一次達到入口節點時,inter指針此時必然也指向入口節點。

3.代碼實現

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode * detectCycle(ListNode * head) {
        if (NULL == head) return NULL;
        ListNode * fast = head;
        ListNode * slow = head;
        
        while (1)
        {
            fast = fast->next ? fast->next : NULL;
            if (NULL == fast) break;
            
            fast = fast->next ? fast->next : NULL;
            if (NULL == fast) break;
            
            slow = slow->next;
    
            if (slow == fast) break;
        }
        
        if (NULL == fast) return NULL;
        
        ListNode * cur = head;
        ListNode * inter = slow;
        
        while (cur != inter)
        {
            cur = cur->next;
            inter = inter->next;
        }
        
        return cur;
    }
};

4.OJ練習

LeetCode 單鏈表是否有環及入口

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • //leetcode中還有花樣鏈表題,這里幾個例子,冰山一角 求單鏈表中結點的個數----時間復雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,535評論 0 6
  • 給出兩個單向鏈表的頭指針,而兩個鏈表都可能帶環,判斷這兩個鏈表是否相交,并且給出他們相交的第一個節點 參考 1)判...
    zcwfeng閱讀 433評論 0 1
  • 判斷兩個單向鏈表是否相交,并找出他們的交點。這個問題我們分三種情況討論: 一. 兩個鏈表都不存在環 問題思路: ...
    AceKitty閱讀 535評論 0 1
  • 推薦大家看下《編程之美》、《程序員面試金典》 還有編程相關網站:leetcode老師講的很多題其實就是這些書和網...
    偷天神貓閱讀 1,292評論 0 6
  • 1.如何判斷單鏈表是否有環? 第一種是尾節點指向頭節點;第二種是尾節點指向鏈表中的某一個節點 解法一:追及法,設置...
    是一動不動的friend閱讀 941評論 0 0