連結串列基礎
阿新 • • 發佈:2021-10-28
- 定義:連結串列是通過指標串聯在一起的線性結構,每個節點是由兩部分組成,一個是資料域一個是指標域(存放下一個節點的指標),最後一個節點指向null。連結串列的入口點成為連結串列的頭節點head。
連結串列的型別:
- 單鏈表:單鏈表的節點只能指向節點的下一個節點。
- 雙鏈表:每個節點有兩個指標域,一個指向下一個節點,一個指向上一個節點;既可以向前查詢也可以向後查詢
- 迴圈連結串列:首尾相連,可以用來解決約瑟夫環問題。(0,1,···,n-1這n個數字排成一個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字(刪除後從下一個數字開始計數)。求出這個圓圈裡剩下的最後一個數字。)
- 連結串列的儲存方式
陣列在記憶體中是連續分佈的,但是連結串列不是,連結串列是通過指標域的指標連結在記憶體中的各個節點。所以連結串列中的節點在記憶體中不是連續分佈的 ,而是散亂分佈在記憶體中的某地址上,分配機制取決於作業系統的記憶體管理。 - 連結串列的使用
- 連結串列的定義:
//單鏈表
struct ListNode{
int val;//節點上儲存的元素
ListNode *next;//指向下一個節點的指標
ListNode (int x) : val(x), next(NULL){})//節點的建構函式
};
- 初始化
ListNode* head = mew ListNode(5);
- 不自己定義建構函式,可以使用C++預設生成的建構函式,但是這個建構函式不會初始化任何變數
使用預設建構函式初始化節點
ListNode* head = new ListNode(); head -> val = 5;//所以如果不定義建構函式使用預設建構函式的話,在初始化的時候就不能直接給變數賦值!
- 連結串列操作
- 刪除節點:只要將C節點的next指標 指向E節點就可以了。D節點依然存留在記憶體裡,只不過是沒有在這個連結串列裡而已。,所以在C++裡最好是再手動釋放這個D節點,釋放這塊記憶體。其他語言例如Java、Python,就有自己的記憶體回收機制,就不用自己手動釋放了。
- 新增節點:斷開原來的指標指向新增的節點,新節點的指標指向原來節點