線性表——迴圈連結串列
阿新 • • 發佈:2018-12-11
迴圈連結串列的簡介
迴圈連結串列本質上和單鏈表並沒有什麼不同,準確的說迴圈連結串列就是特殊的單鏈表。
單鏈表:除了頭結點和尾結點每個節點都有且僅有一個前驅和後繼。
迴圈連結串列:每一個結點都有且僅有一個前驅和後繼。
迴圈連結串列的特點
不管從任一節點開始,都能遍歷整個連結串列
迴圈連結串列的基本操作
1.建立迴圈連結串列
從圖中我們可以看到迴圈連結串列的尾節點直接指向了頭結點,所以建立迴圈連結串列遵循此規律即可。
在這裡我們稍微修改一下,不用頭指標,改用尾指標,這樣子不管是頭結點還是尾節點我們都可以很方便的找到,而不用遍歷整個連結串列。
2.增加元素
增加元素和單鏈表相同,只需要改變指標即可,我們現在有尾指標,可以直接定位到尾節點,將新結點插在尾節點後面即可。
3.刪除元素
從頭結點開始遍歷,直到找到需要刪除的結點,修改指標域即可,但要注意若是刪除的結點剛好是尾節點需要將尾指標往前移動一下。
/** * 結點類 */ class Entry<T>{ /** * 資料域 */ T data; /** * 指標域 */ Entry next; public Entry(){ this.data = null; this.next = null; } public Entry(T data,Entry<T> next){ this.data = data; this.next = next; } public Entry(T data){ this.data = data; } } /** * 連結串列類 */ class CycleLink<T>{ /** * 頭結點 */ Entry<T> head = null; /** * 尾指標 */ Entry<T> last = null; /** * 連結串列長度 */ int size; public CycleLink(){ head = new Entry(); head.next = head; last = head; size = 0; } /** * 增加元素 */ public void add(T data){ Entry<T> node = new Entry(data); node.next = last.next; last.next = node; last = node; size++; } /** * 刪除元素 */ public void delete(T data){ Entry p1 = head; Entry p2 = head.next; while(p2 != head){ if(p2.data == data){ if(p2 == last){//判斷此節點是不是尾節點,如果是,還需要移動尾指標。 last = p1; } p1.next = p2.next; } p1 = p2; p2 = p2.next; size--; } } public void show(){ Entry p = head.next; while(p != head){ System.out.print(p.data+" "); p = p.next; } System.out.println(); } } public class Demo6 { public static void main(String[] args) { CycleLink<Integer> link = new CycleLink<Integer>(); link.add(84); link.add(45); link.add(75); link.add(15); link.add(29); link.add(11); link.add(23); link.add(29); link.add(7); link.show(); link.delete(29); link.show(); link.delete(11); link.show(); link.delete(7); link.show(); } }
執行結果
84 45 75 15 29 11 23 29 7
84 45 75 15 11 23 7
84 45 75 15 23 7
84 45 75 15 23