一、插入操作(insert)
(一)基本原理
雙鏈表就好像是手拉手站成一排的人,每個人的右手(next)拉著下乙個人,左手(prior)拉著前乙個人,每兩個人之間有兩支手互聯.插入操作實際是 向隊伍中增加人員,他需要拉上左右兩邊的人,即共三個人要發生關係,由於每兩個人之間有兩支手互聯,所以要發生4次操作.如已知節點
q,p,需插入s,(稱為原型吧).
----------------------------------
q->next
--->
q p
<---
p->prior
---------------------------------
現在假設需插入節點s,則需進行以下4次操作:
-----------------------------------------
(1)(2)完成q與s的握手
(1)
q->next
= s;
(2)
s->prior = q;
q->next
--->
q s
<---
s->prior
-----------------------------------------
(3)(4)完成s與p的握手
(3)
s->next
= p;
(4)
p->prior = s;
q->next
s->next
--->
--->
q s p
<---
<---
s->prior
p->prior
-------------------------------------------
對於本文的案例,是原型的變種, 只已知節點p,而不知節點q,但通過雙向鍊錶的性質我們可以再初始時(插入前)得到以下關係:
p->prior = q;
所以對於以上的4次操作我們可以作等效替換,即將q 換為 p->prior,則以上4次操作為:
(1)
p->prior->next
= s;
(2)
s->prior = p->prior;
file://(1)(2)完成q與s的握手
(3)
s->next
= p;
(4)
p->prior = s;
file://(3)(4)完成s與p的握手
(二)互換問題
由於不知道q節點,因此用p->prior來代替,所以p->prior的值應當在已經不再使用q節點的時候再改變,由原型:
(1)
q->next
= s;
(2)
s->prior = q;
(3)
s->next
= p;
(4)
p->prior = s;
(4)改變了p->prior的值,而(1)(2)需使用q,所以(4)應當在(1)(2)後。
二、刪除操作(insert)
(一)基本原理
刪除操作就好像某個人退出隊伍,但退出前他需要讓他兩邊的人把手拉上,以保持隊伍的連續性,也好像離職前要把工作要交接好,就好像我現在,哈...,如已知q,s,p, 需刪除s,由於只需兩個人發生關係,所以需進行以下兩次操作:
(1)
q->next
= p;
(2)
p->prior = q;
q->next
s->next
--->
--->
q s p
<---
<---
s->prior
p->prior
q->next
--->
q p
<---
p->prior
對於本例,是上面原型的變種,只已知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)對於雙向鍊錶的刪除,只需知道刪除節點即可完成刪除。
因此對於雙向鍊錶的插入和刪除在該情況下,時間度為o(1)。
關於鍊錶的一些題目
2.刪除遞增有序鍊錶中大於min,小於max的元素 3.逆置鍊錶 4.合併兩個鍊錶 4.合併n個鍊錶 分治法 測試 前乙個與後乙個比較,相同就刪除結點,並釋放記憶體。返回頂部 先找到兩個前驅,釋放中間結點,並且將鍊錶重新鏈起來。返回頂部 public listnode reverselist lis...
關於鍊錶的一些總結
1.在鍊錶頭部新增空頭以消除頭部特殊判斷比較常見,用於刪除和新增元素,啞結點的意思就是在head第乙個節點之前設立乙個節點。2.因為鍊錶的操作有限,所以很多時候我們可以把鍊錶中的元素儲存在陣列中,進行操作。3.鍊錶從前往後遍歷元素簡單,但是從後往前遍歷元素確實困難重重,所以我們可以使用棧來儲存資料,...
5 一些關於鍊錶的練習
1 給定兩個已經排序好的表l1,l2,只用基本的表操作編寫計算l1 l2的過程。std vectorinterse linklist l1,linklist l2 l1 l1 next return temp 原理就是 遍歷l1的結點,然後找出l1的結點在l2中是否也存在,找出存在的資料就是兩個鍊錶...