單連結串列的讀取
在單連結串列中,由於第 i 個元素到底在哪?沒辦法一開始就知道,必須得從頭開始找。因此,對於單連結串列實現獲取第 i 個元素的資料的操作 GetElem,在演算法上,相對要麻煩一些。
思路:
- 宣告一個指標 p 指向連結串列第一個節點,初始化 j 從 1 開始;
- 當 j < i 時,就遍歷連結串列,讓 p 的指標向後移動,不斷指向下一節點,j 累加 1;
- 若到連結串列末尾 p 為空,則說明第 i 個節點不存在;
- 否則查詢成功,返回節點 p 的資料。
單連結串列的插入
假設儲存元素 e 的節點為 s,要實現節點 p、p->next 和 s 之間邏輯關係的變化,只需將節點 s 插入到節點 p、p->next 之間即可。
根本用不著驚動其他節點,只需要讓 s->next 和 p->next 的指標做一點改變即可。
讓 p 的後繼節點改成 s 的後繼節點再把節點 s 變成 p 的後繼節點。
s->next = p->next;
p->next = s;
單連結串列的刪除
設定儲存元素 ai 的節點為 q,要實現將節點 q 刪除單連結串列的操作,其實就是將它的前繼節點的指標繞過,指向它的後繼節點即可。
q = p->next;
p->next = q->next;
# 把 p 的後繼節點改成 p 的後繼的後繼節點
單連結串列第 i 個資料刪除節點的演算法思路
- 宣告一指標 p 指向連結串列頭結點,初始化 j 從 1 開始;
- 當 j< i 時,就遍歷連結串列,讓 p 的指標向後移動,不斷指向下一個結點 j 累加 1;
- 若到連結串列末尾 p 為孔,則說明第 i 個結點不存在;
- 否則查詢成功,將欲刪除的結點 p->next 賦值給 q;
- 單連結串列的刪除標準語句 p->next = q->next;
- 將 q 結點中的資料賦值給 e,作為返回;
- 釋放 q 結點;
- 返回成功。
效率分析
單連結串列插入和刪除演算法,是由兩部分組成:
- 遍歷查詢第 i 個節點
- 插入和刪除節點。
時間複雜度都是 O(n);
從第 i 個位置,插入 10 個節點:
順序儲存結構:每一次插入都需要移動 n-1 個節點,每次都是 O(n)。
單連結串列:需要在第一次時,找到第 i 個位置的指標,透過賦值移動指標,時間複雜度都是 O(1)。
對於插入或刪除資料越頻繁的操作,單連結串列的效率優勢就越是明顯。
本作品採用《CC 協議》,轉載必須註明作者和本文連結