数据结构 -线性结构 ->双向链表

双向链表:就是在单向链表的基础上加了一个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 }

 

posted @ 2020-09-21 10:36  sixsixman  阅读(186)  评论(0)    收藏  举报