線性表 雙向鍊錶

2021-08-27 08:51:41 字數 1980 閱讀 7371

雙向鍊錶是一種特殊的鍊錶。

單鏈表和雙向鍊錶的區別

單鏈表:只能向乙個方向遍歷

雙向鍊錶:向兩邊都可以遍歷。

雙向鍊錶的實現

為了找到節點和前驅,我們給節點增加乙個指向其前驅的指標,如下圖所示

既然單鏈表可以迴圈,那麼雙向鍊錶也就可以迴圈,如下圖所示即為雙向迴圈鍊錶

建立雙向鍊錶和建立單鏈表大同小異,雙向鍊錶的結點有三個域,資料域、前驅和後繼。

當鍊表為空時,頭結點的前驅和後繼都指向它自己,自己構成乙個環。

當鍊表不為空時,除尾結點外,每個結點的前驅都指向它的前乙個結點,後繼均指向它的後乙個結點,尾節點的後繼指向頭結點。

把元素增加在鍊錶最後。

① 建立乙個新的節點

② 新結點的後繼為頭結點

③ 新結點的前驅為尾節點

④ 尾節點的後繼為新結點

⑤ 頭結點的前驅為新結點

⑥ 將尾指標移動到新結點上

把元素插在鍊錶任意位置,如下圖所示

① 建立新結點

② 遍歷鍊錶到達指定的位置 p

③ 新結點的後繼等於 p 的後繼

④ 新結點的後繼(p的後繼)的前驅等於新結點

⑤ 新結點的前驅等於 p 

⑥ p 的後繼等於新結點

刪除尾結點

① 尾節點的前驅的後繼等於頭結點

② 頭結點的前驅等於尾節點的前驅

③ 尾指標向前移動一下

刪除任意位置的元素

① 遍歷鍊錶到適當的位置 p (待刪除的節點)

② p 的前驅的後繼等於  p 的後繼

③ p 的後繼的前驅等於 p 的前驅

* 結點類

*/class node2

public node2(t data)

}/**

* 鍊錶

*/class doublecycle

/*** 增加乙個元素

* @param data

*/public void add(t data)

/*** 刪除乙個元素

* @param data

* @return

*/public boolean delete(t data)

p.next.pre = p.pre;

p.pre.next = p.next;

size--;

return true;

}p = p.next;

} return false; }

public void show()

system.out.println();

} public void show2()

system.out.println(); }}

public class demo5

}執行結果

84 45 75 15 11 23 29 7 

7 29 23 11 15 75 45 84

刪除45

84 75 15 11 23 29 7

7 29 23 11 15 75 84

刪除11

84 75 15 23 29 7

7 29 23 15 75 84

刪除784 75 15 23 29

29 23 15 75 84

線性表之雙向鍊錶

include include define error 0 define ok 1 typedef int status typedef int elemtype typedef struct dulnodedulnode,dulinklist 雙向鍊錶的結構體 兩個指標,分別指向前乙個和後乙個節...

線性表之雙向鍊錶

雙向鍊錶 include include 狀態量 define ok 1 define error 0 adt 雙鏈表結構說明 typedef int elemtype typedef struct dnodedlistnode typedef dlistnode dlinklist 節點 模組定義...

線性表 雙向迴圈鍊錶

雙向鍊錶 double liked list 就是在單向鍊錶的每個結點中,新增乙個指向前驅結點的指標域。class doublenode 雙向鍊錶迴圈帶頭結點的空鍊錶,如圖 非空的迴圈帶頭結點的雙向鍊錶,如圖 插入操作不複雜,不過順序很重要,不要寫反了。假設儲存元素 e 的結點為 s,要實現將結點 ...