雙向鍊錶是一種特殊的鍊錶。
單鏈表和雙向鍊錶的區別
單鏈表:只能向乙個方向遍歷
雙向鍊錶:向兩邊都可以遍歷。
雙向鍊錶的實現
為了找到節點和前驅,我們給節點增加乙個指向其前驅的指標,如下圖所示
既然單鏈表可以迴圈,那麼雙向鍊錶也就可以迴圈,如下圖所示即為雙向迴圈鍊錶
建立雙向鍊錶和建立單鏈表大同小異,雙向鍊錶的結點有三個域,資料域、前驅和後繼。
當鍊表為空時,頭結點的前驅和後繼都指向它自己,自己構成乙個環。
當鍊表不為空時,除尾結點外,每個結點的前驅都指向它的前乙個結點,後繼均指向它的後乙個結點,尾節點的後繼指向頭結點。
把元素增加在鍊錶最後。
① 建立乙個新的節點
② 新結點的後繼為頭結點
③ 新結點的前驅為尾節點
④ 尾節點的後繼為新結點
⑤ 頭結點的前驅為新結點
⑥ 將尾指標移動到新結點上
把元素插在鍊錶任意位置,如下圖所示
① 建立新結點
② 遍歷鍊錶到達指定的位置 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,要實現將結點 ...