演算法學習之資料結構之雙向鍊錶

2021-06-09 04:11:34 字數 1267 閱讀 2428

雙鏈表的沒乙個元素都是物件,每個物件包含乙個關鍵字域和兩個指標域(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 所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!雙向鍊錶 在單鏈表結點上增添了乙...