關於雙向鍊錶的一些分析

2021-06-21 04:51:38 字數 2390 閱讀 4588

一、插入操作(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中是否也存在,找出存在的資料就是兩個鍊錶...