資料結構之單連結串列

Galois發表於2020-10-09

單連結串列的讀取

在單連結串列中,由於第 i 個元素到底在哪?沒辦法一開始就知道,必須得從頭開始找。因此,對於單連結串列實現獲取第 i 個元素的資料的操作 GetElem,在演算法上,相對要麻煩一些。

思路:

  • 宣告一個指標 p 指向連結串列第一個節點,初始化 j 從 1 開始;
  • 當 j < i 時,就遍歷連結串列,讓 p 的指標向後移動,不斷指向下一節點,j 累加 1;
  • 若到連結串列末尾 p 為空,則說明第 i 個節點不存在;
  • 否則查詢成功,返回節點 p 的資料。

單連結串列的插入

假設儲存元素 e 的節點為 s,要實現節點 p、p->next 和 s 之間邏輯關係的變化,只需將節點 s 插入到節點 p、p->next 之間即可。

Y4Vmbj0AgX.png!large

根本用不著驚動其他節點,只需要讓 s->next 和 p->next 的指標做一點改變即可。
讓 p 的後繼節點改成 s 的後繼節點再把節點 s 變成 p 的後繼節點。

s->next = p->next;
p->next = s;

kPqNhnnxbL.png!large

單連結串列的刪除

設定儲存元素 ai 的節點為 q,要實現將節點 q 刪除單連結串列的操作,其實就是將它的前繼節點的指標繞過,指向它的後繼節點即可。

q = p->next;
p->next = q->next;
# 把 p 的後繼節點改成 p 的後繼的後繼節點

aMI1V0bdf9.png!large

單連結串列第 i 個資料刪除節點的演算法思路

  1. 宣告一指標 p 指向連結串列頭結點,初始化 j 從 1 開始;
  2. 當 j< i 時,就遍歷連結串列,讓 p 的指標向後移動,不斷指向下一個結點 j 累加 1;
  3. 若到連結串列末尾 p 為孔,則說明第 i 個結點不存在;
  4. 否則查詢成功,將欲刪除的結點 p->next 賦值給 q;
  5. 單連結串列的刪除標準語句 p->next = q->next;
  6. 將 q 結點中的資料賦值給 e,作為返回;
  7. 釋放 q 結點;
  8. 返回成功。

效率分析

單連結串列插入和刪除演算法,是由兩部分組成:

  1. 遍歷查詢第 i 個節點
  2. 插入和刪除節點。

時間複雜度都是 O(n);

從第 i 個位置,插入 10 個節點:
順序儲存結構:每一次插入都需要移動 n-1 個節點,每次都是 O(n)。
單連結串列:需要在第一次時,找到第 i 個位置的指標,通過賦值移動指標,時間複雜度都是 O(1)。

對於插入或刪除資料越頻繁的操作,單連結串列的效率優勢就越是明顯。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章