程式碼隨想錄演算法訓練營第三天 | 熟悉連結串列

W-Vicky11發表於2024-09-28

引用自程式碼隨想錄:https://programmercarl.com/連結串列理論基礎.html#其他語言版本

連結串列的儲存方式

  • 陣列是在記憶體中是連續分佈的,但是連結串列在記憶體中可不是連續分佈的。
  • 連結串列是透過指標域的指標連結在記憶體中各個節點。
  • 所以連結串列中的節點在記憶體中不是連續分佈的 ,而是散亂分佈在記憶體中的某地址上,分配機制取決於作業系統的記憶體管理。

連結串列的定義

template <typename T>
struct LinkNode           //單連結串列結點型別
{
	T data;               //存放資料元素
	LinkNode<T>* next;    //下一個結點的指標
	LinkNode():next(NULL){}     //建構函式
	LinkNode(T d):data(d),next(NULL){}   //過載建構函式
};

連結串列的操作

刪除節點

注意:如上圖所示,如果直接將C指向E,實際上D節點依然在記憶體中,所以需要手動釋放,
但是其他語言例如python,Java有自己的記憶體回收機制

新增節點

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

連結串列的好處:

  • 陣列在定義的時候,長度就是固定的,如果想改動陣列的長度,就需要重新定義一個新的陣列。
  • 連結串列的長度可以是不固定的,並且可以動態增刪, 適合資料量不固定,頻繁增刪,較少查詢的場景。

其他語言版本的節點構造:

C++:

class ListNode {
  val;
  next = null;
  constructor(value) {
    this.val = value;
    this.next = null;
  }
}

python:

class ListNode:
    def __init__(self, val, next=None):
        self.val = val
        self.next = next

相關文章