首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

雙向鏈表插入與刪除操作圖解:指標操作順序的關鍵邏輯

     編輯:關於C語言

核心隱喻:手拉手的隊伍

雙向鏈表如同一排人手拉手:右手(next)拉後面的人,左手(prior)拉前面的人。每兩人之間有兩雙手相連。插入/刪除本質上是調整這些「手」的連結。

一、插入操作

原型場景:已知 q、p,插入 s

需完成 4 次指標操作(兩雙手各連兩次):

(1) q->next = s;      // q 右手拉 s
(2) s->prior = q;     // s 左手拉 q
(3) s->next = p;      // s 右手拉 p
(4) p->prior = s;     // p 左手拉 s

實際場景:僅知 p,插入 s

利用 q = p->prior 替換,操作序列變為:

(1) p->prior->next = s;   // 原 q->next = s
(2) s->prior = p->prior;  // 原 s->prior = q
(3) s->next = p;
(4) p->prior = s;

⚠️ 指標操作順序鐵律

(4) 必須在 (1)(2) 之後執行!
因 (4) 會修改 p->prior(即 q),而 (1)(2) 仍需用到舊的 q。若先執行 (4),q 就丟失了,導致 (1)(2) 操作錯誤記憶體。

二、刪除操作

原型場景:已知 q、s、p,刪除 s

只需讓 q、p 直接拉手,2 次操作:

(1) q->next = p;
(2) p->prior = q;

實際場景:僅知 s,刪除 s

利用 q = s->prior、p = s->next 替換:

(1) s->prior->next = s->next;
(2) s->next->prior = s->prior;

此處 s、prior、next 在操作中不被修改,故 (1)(2) 順序無關。

三、結論

  1. 雙向鏈表插入:僅需知道插入位置的一個節點即可完成。
  2. 雙向鏈表刪除:僅需知道被刪除節點即可完成。
  3. 在上述條件下,插入與刪除時間複雜度均為 O(1)。

掌握指標操作順序的前後依賴關係,是正確實作雙向鏈表的關鍵。歡迎批評指正。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved