數據結構筆記淺記(七)鏈表

「鏈表 linked list」是一種線性數據結構,其中的每個元素都是一個節點對象,各個節點通過“引用”相連接。 引用記錄了下一個節點的內存地址,通過它可以從當前節點訪問到下一個節點。 鏈表的設計使得各個節點可以分散存儲在內存各處,它們的內存地址無須連續。

每個節點都包含兩項數據:節點的“值”和指向下一節 點的“引用”

         ‧ 鏈表的首個節點被稱爲“頭節點”,最後一個節點被稱爲“尾節點”。

         ‧ 尾節點指向的是“空”,它在 Java、C++ 和 Python 中分別被記爲 null、nullptr 和 None 。

         ‧ 在 C、C++、Go 和 Rust 等支持指針的語言中,上述“引用”應被替換爲“指針”

 

初始化鏈表

建立鏈表分爲兩步,第一步是初始化各個節點對象,第二步是構建節點之間的引用關係。初始化完成後,我 們就可以從鏈表的頭節點出發,通過引用指向 next 依次訪問所有節點。

通常將頭節點當作鏈表的代稱,可記作鏈表 n0 。

操作:n0 = 3,n1 = 2,n2 = 6 ===》n0.next = n1,  n1.next = n2    初始化一個鏈表結構,然後依次賦值,根據給定的鏈表順序,下一個節點值作爲當前節點的 next 指針。

 

插入節點

假設我們想在相鄰的兩個節點 n0 和 n1 之間插入一個新節點 P , 則只需改變兩個節點引用(指針)即可,時間複雜度爲 𝑂(1) 。 相比之下,在數組中插入元素的時間複雜度爲 𝑂(𝑛) ,在大數據量下的效率較低。

操作: n1 = n0.next,P.next = n1,n0.next = P,

 

刪除節點

在鏈表中刪除節點也非常方便,只需改變一個節點的引用(指針)即可。  n1->n2-n3;

操作:n2 = n1.next, n3 = n2.next, n1.next = n3

 

訪問節點、查找節點

在鏈表中訪問節點的效率較低。。鏈表程序需要從頭節點出發,逐個向後遍歷,直至找到目標節點。也就是說,訪問鏈表的第 𝑖 個節點需要循 環 𝑖 − 1 輪,時間複雜度爲 𝑂(𝑛) 。

 

數組和鏈表的各項特點並對比了操作效率

常見鏈表類型

‧ 單向鏈表:即前面介紹的普通鏈表。單向鏈表的節點包含值和指向下一節點的引用兩項數據。我們將首 個節點稱爲頭節點,將最後一個節點稱爲尾節點,尾節點指向空 None 。

‧ 環形鏈表:如果我們令單向鏈表的尾節點指向頭節點(首尾相接),則得到一個環形鏈表。在環形鏈表 中,任意節點都可以視作頭節點。

‧ 雙向鏈表:與單向鏈表相比,雙向鏈表記錄了兩個方向的引用。雙向鏈表的節點定義同時包含指向後繼 節點(下一個節點)和前驅節點(上一個節點)的引用(指針)。相較於單向鏈表,雙向鏈表更具靈活 性,可以朝兩個方向遍歷鏈表,但相應地也需要佔用更多的內存空間。

 

  鏈表典型應用

單向鏈表通常用於實現棧、隊列、哈希表和圖等數據結構

         ‧ 棧與隊列:當插入和刪除操作都在鏈表的一端進行時,它表現出先進後出的特性,對應棧;當插入操作 在鏈表的一端進行,刪除操作在鏈表的另一端進行,它表現出先進先出的特性,對應隊列。

         ‧ 哈希表:鏈式地址是解決哈希衝突的主流方案之一,在該方案中,所有衝突的元素都會被放到一個鏈表中

        ‧ :鄰接表是表示圖的一種常用方式,其中圖的每個頂點都與一個鏈表相關聯,鏈表中的每個元素都代 表與該頂點相連的其他頂點。

雙向鏈表常用於需要快速查找前一個和後一個元素的場景

         ‧ 高級數據結構:比如在紅黑樹、B 樹中,我們需要訪問節點的父節點,這可以通過在節點中保存一個指 向父節點的引用來實現,類似於雙向鏈表。

         ‧ 瀏覽器歷史:在網頁瀏覽器中,當用戶點擊前進或後退按鈕時,瀏覽器需要知道用戶訪問過的前一個和 後一個網頁。雙向鏈表的特性使得這種操作變得簡單。

         ‧ LRU 算法:在緩存淘汰(LRU)算法中,我們需要快速找到最近最少使用的數據,以及支持快速添加 和刪除節點。這時候使用雙向鏈表就非常合適。

環形鏈表常用於需要週期性操作的場景,比如操作系統的資源調度

         ‧ 時間片輪轉調度算法:在操作系統中,時間片輪轉調度算法是一種常見的 CPU 調度算法,它需要對一 組進程進行循環。每個進程被賦予一個時間片,當時間片用完時,CPU 將切換到下一個進程。這種循 環操作可以通過環形鏈表來實現。

         ‧ 數據緩衝區:在某些數據緩衝區的實現中,也可能會使用環形鏈表。比如在音頻、視頻播放器中,數據 流可能會被分成多個緩衝塊並放入一個環形鏈表,以便實現無縫播放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章