1. 程式人生 > >單鏈表和雙鏈表

單鏈表和雙鏈表

陣列的元素個數必須事先制定並且一旦指定之後不能更改,解決這個缺陷的辦法就是連結串列,幾乎可以這樣理解:連結串列就是一個元素個數可以實時變大/變小的陣列。

連結串列是什麼樣的?它是由一個一個結構完全類似的節點構成的,節點中有一些記憶體可以用來儲存資料(所以叫表,表就是資料表),這裡的鏈指的是連結各個表的方法。在C語言中用來連線2個表(其實就是2塊記憶體)的方法就是指標。

節點是由用來儲存資訊完成任務的有效資料和用於指向連結串列的下一個節點的首地址的指標組成。

一個典型的連結串列的實現就是:頭指標指向連結串列的第1個節點,然後第1個節點中的指標指向下一個節點,依次類推直到最後一個節點(最後一個節點指標指向NULL表示結束(建立節點的時候就已經指向了NULL),或者指向自己)。這樣就構成了一個鏈。

連結串列還有另外一種用法,就是把頭指標指向的第一個節點作為頭節點使用(把原來第二個節點當作第一個節點來使用了,依次往後。這樣的話頭節點就是空的。即頭節點+空節點+第一個節點…)。頭節點的特點是:第一,它緊跟在頭指標後面。第二,頭節點的資料部分是空的(有時候不是空的,而是寫程式的時候讓其用來儲存整個連結串列的節點數,數字可以隨著節點的增減而增減,當我們想知道連結串列有多大的時候直接去讀這個數就行了),指標部分指向下一個節點,也就是第一個節點。

連結串列有沒有頭節點是不同的。體現在連結串列的插入節點、刪除節點、遍歷節點、解析連結串列的各個演算法函式都不同。所以如果一個連結串列設計的時候就有頭節點那麼後面的所有演算法都應該這樣來處理;如果設計時就沒有頭節點,那麼後面的所有演算法都應該按照沒有頭節點來做。實際程式設計中兩種連結串列都有人用,所以大家在看別人寫的程式碼時一定要注意看它有沒有頭節點。

單鏈表的節點 = 有效資料 + 指標(指標指向後一個節點),因此單鏈表各個節點之間只由一個指標單向連結,這樣實現有一些侷限性。解決辦法就是:雙鏈表,雙向連結串列的節點 = 有效資料 + 2個指標(一個指向後一個節點,另一個指向前一個節點)。也有頭指標和頭節點。