在單鏈表中,有了next指針,這就使得我們要查找下一結點的時間複雜度爲O(1)。可是如果我們要查找的是上一結點,那最壞時間複雜度就是O(n)。因爲我們每次都要從頭開始遍歷查找。
爲了克服單向性這一缺點,設計雙向鏈表,即設置一個指向其前驅結點的指針域。
既然單鏈表也可以有循環鏈表,那麼雙向鏈表當然也可以是循環表。
p.next.prior = p = p.prior.next
雙向鏈表的許多操作是和單鏈表相同的,比如求長度的ListLength,查找元素的GetElem,獲得元素位置的LocateElem等,這些操作只要涉及一個方向的指針即可,另一指針多了也不能提供什麼幫助。
-
插入
先搞定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
- 刪除
p.prior.next = p.next # 把p.next賦值給p.prior的後繼,如圖1
p.next.prior = p.prior # 把p.prior賦值給p.next的前驅,如圖2
free(p) # 釋放結點