【程式碼隨想錄】二、連結串列:理論基礎

henFiu發表於2024-08-16

原文連結:程式碼隨想錄 - 連結串列理論基礎

1.什麼是連結串列?

連結串列是一種透過指標串聯在一起的線性結構,每一個節點由兩部分組成,一個是資料域一個是指標域(存放指向下一個節點的指標),最後一個節點的指標域指向null(空指標的意思)。連結串列的入口節點稱為連結串列的頭結點也就是head。

2.連結串列的型別

2.1.單連結串列

單連結串列中的指標域只能指向節點的下一個節點。
image

2.2.雙連結串列

雙連結串列:每一個節點有兩個指標域,一個指向下一個節點,一個指向上一個節點。
雙連結串列 既可以向前查詢也可以向後查詢。
如圖所示:image

2.3.迴圈連結串列

迴圈連結串列,顧名思義,就是連結串列首尾相連。
迴圈連結串列可以用來解決約瑟夫環問題。
image

3.儲存方式

陣列是在記憶體中是連續分佈的,但是連結串列在記憶體中可不是連續分佈的。
連結串列是透過指標域的指標連結在記憶體中各個節點。
所以連結串列中的節點在記憶體中不是連續分佈的 ,而是散亂分佈在記憶體中的某地址上,分配機制取決於作業系統的記憶體管理。
如圖所示:
image
這個連結串列起始節點為2, 終止節點為7, 各個節點分佈在記憶體的不同地址空間上,透過指標串聯在一起。

4.連結串列的定義

C/C++的定義連結串列節點方式,如下所示:

// 單連結串列
struct ListNode {
    int val;  // 節點上儲存的元素
    ListNode *next;  // 指向下一個節點的指標
    ListNode(int x) : val(x), next(NULL) {}  // 節點的建構函式
};

5.連結串列的操作

5.1.刪除節點

刪除D節點,如圖所示:
image
只要將C節點的next指標 指向E節點就可以了。
在C++裡最好是再手動釋放這個D節點,釋放這塊記憶體。

5.2.新增節點

如圖所示:
image
可以看出連結串列的增添和刪除都是O(1)操作,也不會影響到其他節點。
但是要注意,要是刪除第五個節點,需要從頭節點查詢到第四個節點透過next指標進行刪除操作,查詢的時間複雜度是O(n)。

6.效能分析

再把連結串列的特性和陣列的特性進行一個對比,如圖所示:
image
陣列在定義的時候,長度就是固定的,如果想改動陣列的長度,就需要重新定義一個新的陣列。
連結串列的長度可以是不固定的,並且可以動態增刪, 適合資料量不固定,頻繁增刪,較少查詢的場景。

相關文章