學習筆記 資料結構04 單迴圈鍊錶

2021-07-11 01:49:32 字數 1524 閱讀 7765

將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶(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

dulnode,*dulinklist;

由於是雙向鍊錶,那麼對於鍊錶中的某乙個結點p,它的後繼的前驅是誰?當然是它自己。它的前驅的後繼自然也是它自己。即

p->next->prior = p =p->prior->next;

空的

非空的

雙向鍊錶是單鏈表中擴充套件出來 的結構,所以它的很多操作是和單鏈表相同的,比如求長度的listlength,查詢元素的getelem,獲得元素位置的locateelem等。這些操作都只要涉及乙個方向的指標即可,另乙個指標多了也不能提供什麼幫助。雙向鍊錶即然是比單鏈表多了如可以反向遍歷查詢等資料結構,那麼也就需要付出一些小的代價:在插入和刪除時,需要更改兩個指標變數。

要刪除結點:

資料結構(Python) 單迴圈鍊錶實現

coding utf 8 import random random.seed 1 class node def init self,x,next none self.val x self.next next 迴圈鍊錶 class circular linked list 帶頭節點迴圈鍊錶的建立 de...

資料結構 線性表 單迴圈鍊錶

資料結構 線性表的鏈式表示 單鏈表 迴圈鍊錶 線性表元素序號從1算起 date 2017 4 13 include include define initsize 100 define elemtype char typedef struct lnodelnode,linklist linklist...

演算法筆記 資料結構 鍊錶

鍊錶節點一般有兩部分組成,即資料域和指標域 struct node 一般說來,資料域放節點要儲存的資料,而指標域指向下乙個結點的位址,這樣就會產生從某個結點開始的 由指標連線的一條鏈式結構,即鍊錶。而以鍊錶是否存在頭結點,又可以把鍊錶分為帶頭結點的鍊錶和不帶頭結點的鍊錶。頭結點一般成為head,且其...