數據結構與算法 — 鏈表

鏈表(經過「指針」將一組零散的內存塊串聯起來使用。)

三種常見鏈表結構:

  1. 單鏈表:鏈表經過指針將一組零散的內存塊串聯在一塊兒。其中,咱們把內存塊稱爲鏈表的「結點」。爲了將全部的結點串起來,每一個鏈表的結點除了存儲數據以外,還須要記錄鏈上的下一個結點的地址。如圖所示,咱們把這個記錄下個結點地址的指針叫作後繼指針next

    如圖所示,你會發現,其中有兩個結點比較特殊,他們分別是第一個結點和最後一個結點。咱們習慣把第一個結點叫作頭結點,把最後一個結點叫作尾結點。其中,頭結點用來記錄鏈表的基地址。有了它,咱們能夠遍歷獲得整條鏈表。而尾結點特殊的地方是:指針不是指向下一個結點,而是指向一個空地址NULL,表示這是鏈表上最後一個結點。與數組同樣,鏈表也支持數據的查找、插入和刪除操做。咱們知道,進行數組的插入,刪除操做時,爲了保持內存的連續性,須要作出大量的數據搬移,因此時間複雜度是O(n)。而在鏈表中插入或者刪除一個數據,咱們並不須要爲了保持內存的連續性而搬移結點,圖中能夠看出,針對鏈表的插入和刪除操做,咱們只須要考慮相鄰結點的指針改變,因此對應時間複雜度是O(1)。數組

    可是有利也有弊。鏈表想要隨機訪問第K個元素,就沒有數組高效了。由於鏈表中的數據並不是連續存儲的,因此沒法像數組那樣,根據首地址和下標,經過尋址公式就能計算出內存地址,而是須要根據指針一個結點一個結點地依次遍歷,直到找到對應的結點。因此,鏈表隨機訪問的性能沒有數組好,須要O(n)的時間複雜度。性能

  2. 循環鏈表:循環鏈表其實是一種特殊的單鏈表。它跟單鏈表惟一的區別就在尾結點。循環鏈表的尾結點指針不是指向NULL,而是指向鏈表的頭結點。

     

  3. 雙向鏈表:單向鏈表只有一個方向,結點只有一個後繼指針next指向後面的結點。而雙向鏈表,顧名思義,它支持兩個方向,每一個結點不止有一個後繼指針next指向後面的結點,還有一個前驅指針prev指向前面的結點。

    從圖中能夠看出,雙向鏈表須要額外的兩個空間來存儲後繼結點和前驅結點的地址。因此存儲一樣多的數據,雙向鏈表要比單鏈表佔用更多的內存空間。雖然兩個指針比較浪費存儲空間,但能夠支持雙向遍歷。spa

相關文章
相關標籤/搜索