1. 程式人生 > >資料結構與演算法04-單迴圈連結串列

資料結構與演算法04-單迴圈連結串列

迴圈連結串列

將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表稱為單迴圈連結串列,簡稱迴圈連結串列(circular linked list)

它解決了一個很麻煩的問題:如何從當中一個結點出發,訪問到連結串列的全部結點。
為了使空連結串列與非空連結串列處理一致,我們通常設一個頭結點,當然這並不是說,迴圈連結串列一定要頭結點。其實迴圈連結串列和單鏈表的主要差異就在於迴圈的判斷條件上,原來判斷p->next是否為空,現在則是p->next不等於頭結點,則迴圈示結束。
在單鏈表中,我們有了頭結點時,我們可以用O(1)的時間訪問第一個結點,但對於要訪問到最後一個結點,卻需要O(n)時間,因為我們需要將單鏈表全部掃描一遍。有沒有可能用O(1)時間由連結串列指標訪問到最後一個結點呢?不過我們需要改造一下這個迴圈連結串列,不用頭指標,而是用指向終端結點的尾指標來表示迴圈連結串列
這裡寫圖片描述


終端結點用尾指標rear指示,則查詢終端結點是O(1),而開始結點,其實就是rear->next->next。其時間很雜也為O(1);

雙向連結串列

我們在單鏈表中,有了next指標,這就使得我們要查詢下一結點的時間複雜度為O(1)。可是如果我們要查詢的是上一結點的話,那最壞的時間複雜度就是O(n)了,因為我們每次都要從頭開始遍歷查詢。為了克服單向性這一缺點,我們的老科學家們,設計出雙向連結串列。
雙向連結串列(double linkedlist): 是在單鏈表的每個結點中,再設定一個指向其前驅結點的指標域。所以在雙向連結串列中的結點都有兩個指標域,一個指向直接後繼,另一個指向直接前驅

/*線性表的雙向連結串列儲存結構*/
typedef struct DulNode
{
  ElemType data;
  struct DulNode   *prior;//直接前驅指標
  struct DulNode   *next; //直接後繼指標
}DulNode,*DuLinkList;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

由於是雙向連結串列,那麼對於連結串列中的某一個結點p,它的後繼的前驅是誰?當然是它自己。它的前驅的後繼自然也是它自己。即
p->next->prior = p =p->prior->next;
空的
這裡寫圖片描述

非空的
這裡寫圖片描述

雙向連結串列是單鏈表中擴展出來 的結構,所以它的很多操作是和單鏈表相同的,比如求長度的ListLength,查詢元素的GetElem,獲得元素位置的LocateElem等。這些操作都只要涉及一個方向的指標即可,另一個指標多了也不能提供什麼幫助。雙向連結串列即然是比單鏈表多瞭如可以反向遍歷查詢等資料結構,那麼也就需要付出一些小的代價:在插入和刪除時,需要更改兩個指標變數。
這裡寫圖片描述

要刪除結點:

這裡寫圖片描述