1. 程式人生 > 實用技巧 >資料結構 -線性結構 ->雙向連結串列

資料結構 -線性結構 ->雙向連結串列

雙向連結串列:就是在單向連結串列的基礎上加了一個pre(指向該節點的前一個節點)域,其他的沒有改變,在對連結串列進行增刪相關操作時在單向連結串列的基礎上多以一個向前節點連線的動作即可。

    因為有了指向前一個節點域,所以雙向在查詢資料上比單向的速度要快。

  1 /**
  2  * 雙向連結串列
  3  */
  4 class DoubleLinkedList {
  5     private StartNode2 head = new StartNode2(0, " ", "");
  6 
  7     public StartNode2 getHead() {
  8         return
head; 9 } 10 11 /** 12 * 雙向連結串列按照順序新增資料 13 */ 14 public void addByOder(StartNode2 startNode2) { 15 StartNode2 temp = head; 16 boolean flag = false; 17 //迴圈連結串列,分別找到中間新增資料的標籤和末端新增資料的標籤 18 while (true) { 19 if (temp.next == null
) { 20 break;//新增結束 21 } 22 if (temp.next.no > startNode2.no) { 23 break; 24 //連結串列中按順序新增資料 25 } 26 if (temp.next.no == startNode2.no) { 27 flag = true;//新增資料有重複 28 break
; 29 } 30 temp = temp.next; 31 } 32 if (flag) { 33 System.out.println("新增資料已有"); 34 } else { 35 if (temp.next != null) { 36 temp.next.pre = startNode2;//節點的前後指向有順序要求,不同的順序導致結果不一樣,要先將插入節點與被比較節點的位置互換,再連線前節點 37 startNode2.next = temp.next; 38 temp.next = startNode2; 39 startNode2.pre = temp; 40 } else { 41 temp.next = startNode2;//新增資料為連結串列最後 42 startNode2.pre = temp; 43 } 44 } 45 } 46 47 /** 48 * 雙向連結串列新增資料,與單向連結串列差不多,需要在新增的資料上比單向多一個pre 49 */ 50 public void add(StartNode2 startNode2) { 51 StartNode2 temp = head; 52 while (temp.next != null) { 53 temp = temp.next; 54 } 55 temp.next = startNode2; 56 startNode2.pre = temp; 57 } 58 59 /** 60 * 顯示連結串列,與單向連結串列相同 61 */ 62 public void showList() { 63 if (head.next == null) { 64 System.out.println("連結串列為空~"); 65 return; 66 } 67 StartNode2 temp = head.next; 68 while (temp != null) { 69 System.out.println(temp); 70 temp = temp.next; 71 } 72 } 73 74 /** 75 * 修改雙向連結串列中的資料,與單向連結串列的修改資料方式相同 76 */ 77 public void update(StartNode2 startNode2) { 78 if (head.next == null) { 79 System.out.println("連結串列為空!"); 80 return; 81 } 82 boolean flag = false; 83 StartNode2 temp = head; 84 while (temp.next != null) { 85 if (temp.next.no == startNode2.no) { 86 flag = true; 87 break;//找到 88 } 89 temp = temp.next; 90 } 91 if (flag) { 92 temp.next.name = startNode2.name; 93 temp.next.nickName = startNode2.nickName; 94 } else { 95 System.out.println("沒有修改"); 96 } 97 } 98 99 /** 100 * 刪除雙向連結串列中的資料,與單向不同 101 * 單向需要找到被刪除節點的前一個節點 102 * 雙向連結串列則不同,只需要將需要刪除的節點自身next,pre修改即可 103 */ 104 public void delete(int num) { 105 if (head.next == null) { 106 System.out.println("連結串列為空!"); 107 return; 108 } 109 boolean flag = false; 110 StartNode2 temp = head.next; 111 while (true) { 112 if (temp == null) { 113 break; 114 } 115 if (temp.no == num) { 116 flag = true; 117 break; 118 } 119 temp = temp.next; 120 } 121 if (flag) { 122 temp.pre.next = temp.next;//被刪除資料的前一個數直接指向後一個,該數沒有被指向,直接被jvm垃圾回收機制處理 123 if (temp.next != null) { 124 temp.next.pre = temp.pre; 125 } 126 System.out.printf("no為%d的資料已刪除\n", num); 127 } else { 128 System.out.println("未找到資料,無刪除"); 129 } 130 131 } 132 } 133 134 class StartNode2 { 135 int no; 136 String name; 137 String nickName; 138 StartNode2 next; 139 StartNode2 pre; 140 141 public StartNode2(int no, String name, String nickName) { 142 this.no = no; 143 this.name = name; 144 this.nickName = nickName; 145 } 146 147 @Override 148 public String toString() { 149 return "StartNode{" + 150 "no=" + no + 151 ", name='" + name + '\'' + 152 ", nickName='" + nickName + '\'' + 153 '}'; 154 } 155 }