java 連結串列 單向 雙向
阿新 • • 發佈:2022-03-05
Java-連結串列
1、什麼是連結串列?
2、連結串列的特點是什麼?
3、連結串列的實現原理?
4、如何自己寫出一個連結串列?
1、什麼是連結串列?
- 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連線次序實現的。
- 每一個連結串列都包含多個節點,節點又包含兩個部分,一個是資料域(儲存節點含有的資訊),一個是引用域(儲存下一個節點或者上一個節點的地址)。
- 連結串列的理解示意圖
2、連結串列的特點是什麼?
- 獲取資料麻煩,需要遍歷查詢,比陣列慢
- 方便插入、刪除
3、連結串列的實現原理
- 建立一個節點類,其中節點類包含兩個部分,第一個是資料域(你到時候要往節點裡面儲存的資訊),第二個是引用域(相當於指標,單向連結串列有一個指標,指向下一個節點;雙向連結串列有兩個指標,分別指向下一個和上一個節點)
- 建立一個連結串列類,其中連結串列類包含三個屬性:頭結點、尾節點和大小,方法包含新增、刪除、插入等等方法。
單向連結串列的節點類:
1 public class Node { 2 public Object data; 3 public Node next; 4 5 public Node(Object e){ 6 this.data = e; 7 } 8 }
雙向連結串列的節點類:
1 public class Node { 2 public Object e; 3 public Node next; 4 public Node pre; 5 public Node(){ 6 7 } 8 public Node(Object e){ 9 this.e = e; 10 next = null; 11 pre = null; 12 } 13 }
4、如何自己寫出一個連結串列?
程式碼如下(以雙向連結串列為例,有詳細的註釋,單向連結串列同理):
首先建立了一個節點類
1 package MutuLink; 2 3 public class Node { 4 public Object e; 5 public Node next; 6 public Node pre; 7 public Node(){ 8 9 } 10 public Node(Object e){ 11 this.e = e; 12 next = null; 13 pre = null; 14 } 15 }
然後建立了一個連結串列類
1 package MutuLink; 2 3 public class MyList { 4 private Node head; 5 private Node tail; 6 private int size = 0; 7 8 public MyList() { 9 head = new Node(); 10 tail = new Node(); 11 head.next =null; 12 tail.pre = null; 13 } 14 15 public boolean empty() { 16 if (head.next == null) 17 return true; 18 return false; 19 } 20 //找到所找下標節點的前一個節點 21 public Node findpre(int index){ 22 Node rnode = head; 23 int dex = -1; 24 while(rnode.next != null){ 25 //找到了插入節點的上一個節點 26 if( dex== index - 1){ 27 return rnode; 28 } 29 rnode = rnode.next; 30 dex++; 31 } 32 return null; 33 } 34 public Node findthis(int index){ 35 Node rnode = head; 36 //把rnode想象為指標,dex為指向的下標,這個地方很容易錯,因為當指向最後一個節點時沒有判斷IF就跳出迴圈了 37 int dex = -1; 38 while(rnode.next != null){ 39 if(dex == index) 40 return rnode; 41 rnode = rnode.next; 42 dex++; 43 } 44 if(dex == size - 1){ 45 return rnode; 46 } 47 // Node test = new Node(new Students("haha",1,2)); 48 return null; 49 } 50 51 // 往連結串列末尾加入節點 52 public void add(Object e) { 53 Node node = new Node(e); 54 Node rnode = head; 55 //如果是空連結串列的話插入一個節點,這個節點的pre不能指向上一個節點,必須指空 56 if (this.empty()) { 57 rnode.next = node; 58 rnode.next.pre = null; 59 tail.pre = node; 60 size++; 61 } else { 62 while (rnode.next != null) 63 rnode = rnode.next; 64 rnode.next = node; 65 node.pre = rnode; 66 tail.pre = node; 67 size++; 68 } 69 } 70 //往連結串列的某一個標插入一個節點 71 public boolean add(int index,Object e){ 72 if(index <0||index>=size) 73 return false; 74 Node node = new Node(e); 75 Node prenode = this.findpre(index); 76 node.next = prenode.next; 77 prenode.next.pre = node; 78 prenode.next = node; 79 node.pre = prenode; 80 size++; 81 return true; 82 } 83 public boolean add(int index,MyList myl){ 84 if(index <0 || index >= size) 85 return false; 86 Node prenode = this.findpre(index); 87 // myl.tail.pre.next = prenode.next; 88 // prenode.pre = myl.tail.pre; 89 // tail.pre = null; 90 // prenode.next = myl.head.next; 91 // myl.head.next.pre = prenode; 92 // head.next = null; 93 myl.tail.pre.next = prenode.next; 94 prenode.next.pre = myl.tail.pre.pre; 95 myl.head.next.pre = prenode.pre; 96 prenode.next = myl.head.next; 97 myl.head = null; 98 myl.tail = null; 99 size+=myl.size; 100 return true; 101 } 102 103 public Object remove(int index){ 104 Object ob= this.get(index); 105 if(index <0 || index >= size) 106 return null; 107 //特殊情況,當移除節點是最後一個節點的時候 108 //較為複雜通過畫圖來寫程式碼 109 if(index == size - 1){ 110 Node prenode = this.findpre(index); 111 this.tail.pre = this.tail.pre.pre; 112 this.tail.pre.next.pre = null; 113 this.tail.pre.next =null; 114 size--; 115 return ob; 116 } 117 //比較複雜,通過畫圖解決 118 else{ 119 Node prenode = this.findpre(index); 120 prenode.next = prenode.next.next; 121 prenode.next.pre.next = null; 122 prenode.next.pre = prenode.next.pre.pre; 123 size--; 124 return ob; 125 } 126 } 127 128 129 public Object get(int index){ 130 Node thisnode = this.findthis(index); 131 return thisnode.e; 132 } 133 public int size(){ 134 return size; 135 } 136 }
最後測試
1 package MutuLink; 2 3 import java.util.Random; 4 5 public class manage { 6 public static void main(String[] args) { 7 String name = ""; 8 int credit; 9 int age; 10 int size; 11 MyList myl = new MyList(); 12 Random random = new Random(); 13 size = random.nextInt(5) + 1; 14 for (int i = 0; i < size; i++) { 15 credit = random.nextInt(5); 16 age = random.nextInt(5) + 18; 17 for (int j = 0; j < 4; j++) { 18 name += (char) (random.nextInt(26) + 97); 19 } 20 Students stu = new Students(name, credit, age); 21 myl.add(stu); 22 name = ""; 23 } 24 25 System.out.println("Size of myl1 is "+ myl.size()); 26 for(int i = 0; i < myl.size() ;i++){ 27 Students stu2 = (Students) myl.get(i); 28 stu2.show(); 29 } 30 // //測試能否在連結串列末尾加入節點(成功) 31 // for(int i = 0; i < myl.size() ;i++){ 32 // Students stu2 = (Students) myl.get(i); 33 // stu2.show(); 34 // } 35 // //測試能否通過下標加入一個節點(成功) 36 // Students stu3 = new Students("cyt",5,18); 37 // myl.add(1, stu3); 38 // System.out.println("Size is "+ myl.size()); 39 // for(int i = 0; i < myl.size() ;i++){ 40 // Students stu2 = (Students) myl.get(i); 41 // stu2.show(); 42 // } 43 44 MyList myl2 = new MyList(); 45 size = random.nextInt(5) + 1; 46 for (int i = 0; i < size; i++) { 47 credit = random.nextInt(5); 48 age = random.nextInt(5) + 18; 49 for (int j = 0; j < 4; j++) { 50 name += (char) (random.nextInt(26) + 97); 51 } 52 Students stu2 = new Students(name, credit, age); 53 myl2.add(stu2); 54 name = ""; 55 } 56 System.out.println("Size is of myl2 "+ myl2.size()); 57 for(int i = 0; i < myl2.size() ;i++){ 58 Students stu2 = (Students) myl2.get(i); 59 stu2.show(); 60 } 61 62 63 64 myl.add(1, myl2); 65 System.out.println("Size is of myl1 "+ myl.size()); 66 for(int i = 0; i < myl.size() ;i++){ 67 Students stu2 = (Students) myl.get(i); 68 stu2.show(); 69 } 70 71 72 } 73 74 }
結果輸出:
這樣,一個簡單的雙向連結串列就編寫完成了,希望這篇部落格對您有所幫助哦!
博主教你手擼JVM 開源專案https://github.com/anons-org/nada
https://gitee.com/grateful/nada
博主長期對外收徒,歡迎諮詢。
《程式語言設計和實現》《MUD遊戲開發》《軟體破解和加密》《遊戲輔助外掛》《JAVA開發》 以上課程非誠勿擾!
=================================
QQ:184377367
java新手自學群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/開發/運維)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
微控制器嵌入式/電子電路入門群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
作業系統研發群:15375777
彙編/輔助/破解新手群:755783453
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。