單向迴圈鍊錶

2021-09-27 07:32:58 字數 1766 閱讀 1491

什麼是單向迴圈鍊錶?

如果把單鏈表的最後乙個節點的指標指向鍊錶頭部,而不是指向null,那麼就構成了乙個單向迴圈鍊錶,通俗講就是把尾節點的下一跳指向頭結點。

為什麼要使用單向迴圈鍊錶?

在單向鍊錶中,頭指標是相當重要的,因為單向鍊錶的操作都需要頭指標,所以如果頭指標丟失或者破壞,那麼整個鍊錶都會遺失,並且浪費鍊錶記憶體空間,因此我們引入了單向迴圈鍊錶這種資料結構。

如下圖所示:

單向迴圈鍊錶我們需要注意乙個問題:

在鍊錶中我們使用的是虛擬頭結點,但是在迴圈鍊錶中我們在遍歷的時候就會遇到麻煩,因此在單向迴圈鍊錶中我們使用的是真實頭結點。

具體的實現示意圖如下圖所示:

單向迴圈鍊錶的插入:

單向迴圈鍊錶的插入與單向鍊錶有所不同,因為單向迴圈鍊錶首尾相連,所以沒有從尾部插入的問題。

(1)從鍊錶頭部插入

將新插入的節點變為鍊錶頭部,next指向原來的第乙個節點,在遍歷整個鍊錶找到鍊錶末尾(即它的next指向的是head的那個節點),將這個節點的next指向新插入的節點,最後再將煉表頭指標指向新節點。

(2)從鍊錶中間插入

此時插入的過程和單向鍊錶的一樣,找到要插入位置前驅節點,將前驅節點的next指向新節點的next,再將前驅節點的next指向新插入的節點。

單向迴圈鍊錶的類圖如下圖所示:

具體**實現如下圖所示:

public class loopsingleimplements list	}	

private node head;

private node rear;

private int size;

public loopsingle()

public node getnode()

public loopsingle(e arr)

@override

public int getsize()

@override

public boolean isempty()

@override

public void add(int index, e e)

if(size==0) else if(index==0) else if(index==size) else

node p = head;

for(int i=0;i=size)

node p = head;

for(int i=0;i=size)

e e = null;

node n;

if(size==1) else if(index==0) else if(index==size-1)

p.next = head;

rear = p;

n.next = null;

} else

n = n.next;

p = p.next;

}return true;}}

return false;

}

單向迴圈鍊錶

單向迴圈鍊錶.cpp 定義控制台應用程式的入口點。include stdafx.h include include clinklist.h using namespace std int tmain int argc,tchar argv int n 5 測試空鍊錶 clinklistclist a...

迴圈單向鍊錶

typedef struct list list 初始化乙個迴圈單向鍊錶 void list init list head 判斷鍊錶是否為空 int is list empty list head 往迴圈單向鍊錶中插入乙個元素 prev 在prev元素後面插入 void list insert li...

單向鍊錶迴圈

include include include include includetypedef struct looplink looplink,plooplink 設定結點物件,包含兩個成員,nvalue和指向下乙個物件的指標pnext plooplink create phead nvalue 9...