引用自程式碼隨想錄: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