1. 程式人生 > 其它 >java 連結串列 單向 雙向

java 連結串列 單向 雙向

Java-連結串列

1、什麼是連結串列?

2、連結串列的特點是什麼?

3、連結串列的實現原理?

4、如何自己寫出一個連結串列?


1、什麼是連結串列?

  • 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連線次序實現的。
  • 每一個連結串列都包含多個節點,節點又包含兩個部分,一個是資料域(儲存節點含有的資訊),一個是引用域(儲存下一個節點或者上一個節點的地址)。
  • 連結串列的理解示意圖

2、連結串列的特點是什麼?

  • 獲取資料麻煩,需要遍歷查詢,比陣列慢
  • 方便插入、刪除

3、連結串列的實現原理

  1. 建立一個節點類,其中節點類包含兩個部分,第一個是資料域(你到時候要往節點裡面儲存的資訊),第二個是引用域(相當於指標,單向連結串列有一個指標,指向下一個節點;雙向連結串列有兩個指標,分別指向下一個和上一個節點)
  2. 建立一個連結串列類,其中連結串列類包含三個屬性:頭結點、尾節點和大小,方法包含新增、刪除、插入等等方法。

單向連結串列的節點類:

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
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。