資料結構與演算法分析——連結串列

g-sabo發表於2019-12-03

連結串列是一種常見的資料結構,是一組有序的資料,每個連結串列中的資料項稱為元素。

它跟陣列很像,二者對比學習會更容易理解和記憶。陣列是記憶體中連續的一塊,不會間斷。連結串列在記憶體中不一定是連續的一塊。如果記憶體只剩 10M,且不是連續的,定義陣列就會失敗,定義連結串列就是成功的。陣列為了保證記憶體地址的連續性,當做刪除和插入時,需要做大量遷移工作,而連結串列是不需要遷移操作的。所以陣列更適合快速查詢,連結串列更適合插入、刪除操作。

連結串列中會有一些常見屬性或方法,比如連結串列中的元素個數,連結串列當前的位置,向連結串列增加一個元素,從連結串列中刪除一個元素,清空連結串列等一系列操作。

連結串列結構有很多種,其中三種比較常見:單連結串列、雙向連結串列、迴圈連結串列以及雙向迴圈連結串列。

連結串列是一組節點組成的集合,為了將不連續的記憶體串聯起來,每個節點除了儲存資料外,還需要記錄下一個節點的地址。

資料結構與演算法分析——連結串列

資料結構與演算法分析——連結串列

如圖:data 中儲存著資料,next 儲存著下一個節點的地址。
連結串列中,二個節點比較特殊,分別是第一個節點和最後一個節點。第一個節點被叫做頭結點,用來記錄連結串列的基地址,由此我們可以輕鬆找到該連結串列了。最後一個節點叫做尾節點,它是最後一個節點,沒有下一個節點,所以它的指標指向一個空地址。實現LRU就可以用單連結串列實現。

資料結構與演算法分析——連結串列

資料結構與演算法分析——連結串列
圖上,演示了連結串列的插入和刪除操作。也說明了,連結串列的刪除和插入操作不需要移動其他節點。

迴圈連結串列和和單連結串列的區別就是尾節點,單連結串列最後一個節點指向null,而迴圈連結串列指向連結串列的頭結點。

資料結構與演算法分析——連結串列

相比單連結串列,迴圈連結串列在找首節點時有著很大的優勢,很方便就可以找到首節點。這使得它更適合處理有環形結構的資料,比如約瑟夫問題。

資料結構與演算法分析——連結串列

雙向連結串列也叫雙連結串列,它的每個結點都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。

相比單連結串列,在刪除或插入特定指標指向的節點時,雙連結串列在刪除或插入更具優勢。刪除操作的時間複雜度都是 O(1) ,但是刪除時需要知道前驅指標,雙向連結串列儲存了前驅指標,所以可以直接獲取到。雙連結串列消耗了更多的空間,但是執行時間少了,是空間換時間的設計思路。

雙向迴圈連結串列就是迴圈連結串列個雙連結串列的結合,感興趣可以自己看看,本質差不多。

以上內容很好理解,難點在於實際編碼過程。大家可以試試編寫,插入和刪除操作、單連結串列的反轉、二個連結串列合併、刪除倒數第 n 個節點、找連結串列的中間節點。以上操作是常見的操作,但真正動手可能沒有想象中那麼簡單。

  1. 理解指標和引用的含義, 初學者在 p->next 、q->next處就會開始犯錯,導致連結串列斷裂或者指標丟失( 我就是 )。
  2. 特殊情況要格外小心,bug多出現在這裡 。例如連結串列為空時,連結串列只有一個節點時。
  3. 可以畫圖輔助。
  4. 多練習,刷刷題。

相關文章