雙向鏈表如同一排人手拉手:右手(next)拉後面的人,左手(prior)拉前面的人。每兩人之間有兩雙手相連。插入/刪除本質上是調整這些「手」的連結。
需完成 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
利用 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、p 直接拉手,2 次操作:
(1) q->next = p;
(2) p->prior = q;
利用 q = s->prior、p = s->next 替換:
(1) s->prior->next = s->next;
(2) s->next->prior = s->prior;
此處 s、prior、next 在操作中不被修改,故 (1)(2) 順序無關。
掌握指標操作順序的前後依賴關係,是正確實作雙向鏈表的關鍵。歡迎批評指正。