1. 程式人生 > 實用技巧 >資料結構之連結串列

資料結構之連結串列

我們學習另一種資料結構 —— 連結串列。

與陣列相似,連結串列也是一種線性資料結構。這裡有一個例子:

正如我們所看到的,連結串列中的每個元素實際上是一個單獨的物件,而所有物件都通過每個元素中的引用欄位連結在一起。

連結串列有兩種型別:單鏈表和雙鏈表。上面給出的例子是一個單鏈表,這裡有一個雙鏈表的例子:

溫故而知新,學完這一模組,我們會:

1.瞭解單鏈表和雙鏈表的結構;
2.在單鏈表或雙鏈表中實現遍歷、插入和刪除;
3.分析在單鏈表或雙鏈表中的各種操作的複雜度;
4.在連結串列中使用雙指標技巧(快指標慢指標技巧);
5.解決一些經典問題,例如反轉連結串列;
6.分析你設計的演算法的複雜度;
7.積累設計和除錯的經驗。

- 單鏈表

單鏈表中的每個結點不僅包含值,還包含連結到下一個結點的引用欄位。通過這種方式,單鏈表將所有結點按順序組織起來。、

下面是一個單鏈表的例子:

藍色箭頭顯示單個連結列表中的結點是如何組合在一起的。
下面程式碼是單鏈表中結點的典型定義:

// Definition for singly-linked list.
public class SinglyListNode {
    int val;
    SinglyListNode next;
    SinglyListNode(int x) { val = x; }
}

與陣列不同,我們無法在常量時間內訪問單鏈表中的隨機元素。 如果我們想要獲得第 i 個元素,我們必須從頭結點逐個遍歷。 我們按索引來訪問元素平均要花費 O(N) 時間,其中 N 是連結串列的長度。

例如,在上面的示例中,頭結點是 23。訪問第 3 個結點的唯一方法是使用頭結點中的“next”欄位到達第 2 個結點(結點 6); 然後使用結點 6 的“next”欄位,我們能夠訪問第 3 個結點。

你可能想知道為什麼連結串列很有用,儘管它在通過索引訪問資料時(與陣列相比)具有如此糟糕的效能。 在接下來的兩篇文章中,我們將介紹插入和刪除操作,你將瞭解到連結串列的好處。

之後,我們將為你提供練習設計自己的單鏈表。
如果我們想在給定的結點 prev 之後新增新值,我們應該:

1.使用給定值初始化新結點 cur;

2.將 cur 的“next”欄位連結到 prev 的下一個結點 next;

3.將 prev 中的“next”欄位連結到 cur 。

與陣列不同,我們不需要將所有元素移動到插入元素之後。因此,您可以在 O(1) 時間複雜度中將新結點插入到連結串列中,這非常高效。

示例


讓我們在第二個結點 6 之後插入一個新的值 9。

我們將首先初始化一個值為 9 的新結點。然後將結點 9 連結到結點 15。最後,將結點 6 連結到結點 9。

插入之後,我們的連結串列將如下所示:

在開頭新增結點

眾所周知,我們使用頭結點來代表整個列表。

因此,在列表開頭新增新節點時更新頭結點 head 至關重要。

初始化一個新結點 cur;
將新結點連結到我們的原始頭結點 head。
將 cur 指定為 head。
例如,讓我們在列表的開頭新增一個新結點 9。

1.我們初始化一個新結點 9 並將其連結到當前頭結點 23。

2.指定結點 9 為新的頭結點。