雙鏈表的沒乙個元素都是物件,每個物件包含乙個關鍵字域和兩個指標域(next,prev)。當然,每個物件還可能包含一些其他的衛星資料。next指向後繼節點,prev指向前驅節點。如果prev[x] == null,則無前驅節點,是head頭節點。如果next[x] == null則無後繼節點,是最後乙個節點,即尾節點tail。
雙鏈表的具體操作如下:
雙向鍊錶的插入:insert(l, x)
next[x]=head[l] //頭插法,當前節點x的下乙個節點指向頭節點
if head[l] != null // 頭節點不為空
then prev[head[l]] = x //頭節點的上乙個節點指向x
head[l] = x //重置頭節點
prev[x] = null //頭節點的上乙個節點置為空
搜尋:
search(l, k)
x = head[l]
while x != null and key[x] != k
do x = next[x]
return x;
刪除:
delete(l, x)
if(prev[x] != null) //如果當前節點不是頭節點
then next[prev[x]] = next[x] //當前節點x的上個節點的下乙個節點置為當前節點x的下乙個節點
else head[l] = next[x] //否則頭節點置為當前節點x的下乙個節點
if next[x] != null
then prev[next[x]] = prev[x] // 當前節點x的下個節點的上乙個節點置為當前節點x的上乙個節點
哨兵nil[l],有其他元素一樣的各個域
可以簡化邊界條件,將雙向鍊錶變成帶哨兵的環形雙向鍊錶,哨兵元素介於頭和尾之間,next[nil[l]]指向頭節點,prev[nil[l]]指向尾節點,同樣表頭的prev域和表尾的next域都指向nil[l],這樣可以吧head[l]換成next[nil[l]]。
插入:
next[x] = next[nil[l]]
prev[next[nil[l]] = x
next[nil[l]] = x
prev[x] = null
刪除:
next[prev[x]] = next[x]
prev[next[x]] = prev[x]
資料結構之雙向鍊錶
簡述 指標域有乙個指標 而言,占用資源更大,但相應的 雙向鍊錶遍歷的時候只需要乙個指標就可以,而且 只有得到其中任何乙個節點就是得到整個鍊錶,單向鍊錶必須得到他的頭節點,才能遍歷整個鍊錶,而且得有兩個指標。實現 bothwaylinklist.h ifndef mymodule h define m...
資料結構之 雙向鍊錶
單鏈表的結點都只有乙個指向下乙個結點的指標。單鏈表的資料元素無法直接訪問其前驅元素。建立鍊錶 銷毀鍊錶 獲取鍊錶長度 清空鍊錶 獲取第pos個元素操作 插入元素到位置pos 刪除位置pos處的元素 dlinklist dlinklist creat 建立乙個鍊錶 void dlinklist des...
資料結構之雙向鍊錶
雙向鍊錶宛如一列火車,剛發明的時候只有乙個頭,如果它的行駛路線為 a b c d e f g h i j k a 這個時候有一批貨物需要從k運到j,那麼它的運輸路線一定是 k a b c d e f g h i j 所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!雙向鍊錶 在單鏈表結點上增添了乙...