03.雙向鏈表(五)

在單鏈表中,有了next指針,這就使得我們要查找下一結點的時間複雜度爲O(1)。可是如果我們要查找的是上一結點,那最壞時間複雜度就是O(n)。因爲我們每次都要從頭開始遍歷查找。

爲了克服單向性這一缺點,設計雙向鏈表,即設置一個指向其前驅結點的指針域。

既然單鏈表也可以有循環鏈表,那麼雙向鏈表當然也可以是循環表。

在這裏插入圖片描述

p.next.prior = p = p.prior.next

雙向鏈表的許多操作是和單鏈表相同的,比如求長度的ListLength,查找元素的GetElem,獲得元素位置的LocateElem等,這些操作只要涉及一個方向的指針即可,另一指針多了也不能提供什麼幫助。

  1. 插入

    先搞定s的前驅和後繼,在搞定後結點的前驅,最後解決前結點的後繼

在這裏插入圖片描述

s.prior = p # 把p賦值給s的前驅,如圖中1
s.next = p.next # 把p.next賦值給s的後繼,如圖中2
p.next.prior = s # 把s賦值給p.next的前驅,如圖3
p.next = s # 把s賦值給p的後繼,如圖中4
  1. 刪除

在這裏插入圖片描述

p.prior.next = p.next # 把p.next賦值給p.prior的後繼,如圖1
p.next.prior = p.prior # 把p.prior賦值給p.next的前驅,如圖2
free(p) # 釋放結點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章