1. 程式人生 > 其它 >小結 - 連結串列中的雙指標

小結 - 連結串列中的雙指標

提示
它與我們在陣列中學到的內容類似。但它可能更棘手而且更容易出錯。你應該注意以下幾點:

1. 在呼叫 next 欄位之前,始終檢查節點是否為空。

獲取空節點的下一個節點將導致空指標錯誤。例如,在我們執行 fast = fast.next.next 之前,需要檢查 fast 和 fast.next 不為空。

2. 仔細定義迴圈的結束條件。

 

執行幾個示例,以確保你的結束條件不會導致無限迴圈。在定義結束條件時,你必須考慮我們的第一點提示。

 

複雜度分析
空間複雜度分析容易。如果只使用指標,而不使用任何其他額外的空間,那麼空間複雜度將是 O(1)。但是,時間複雜度的分析比較困難。為了得到答案,我們需要分析執行迴圈的次數。

在前面的查詢迴圈示例中,假設我們每次移動較快的指標 2 步,每次移動較慢的指標 1 步。

  1.如果沒有迴圈,快指標需要 N/2 次才能到達連結串列的末尾,其中 N 是連結串列的長度。
  2.如果存在迴圈,則快指標需要 M 次才能趕上慢指標,其中 M 是列表中迴圈的長度。
顯然,M <= N 。所以我們將迴圈執行 N 次。對於每次迴圈,我們只需要常量級的時間。因此,該演算法的時間複雜度總共為 O(N)。

自己分析其他問題以提高分析能力。別忘了考慮不同的條件。如果很難對所有情況進行分析,請考慮最糟糕的情況。

 

雙指標問題總結:

雙指標移動方向,同向/對向?
雙指標移動速度,每次移動1步/2步?
雙指標起始時的間隔,起始點位於同一節點/起始點間隔一定的距離?

 

連結串列 - LeetBook - 力扣(LeetCode)全球極客摯愛的技術成長平臺 (leetcode-cn.com)