首页 > 链表 -- 双向循环链表(线性表)

链表 -- 双向循环链表(线性表)

1,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

 

2,构建节点类

 

public class DNode {Object item;DNode prev;DNode next;public DNode(){}public DNode(DNode prev,Object item,DNode next){this.item = item;this.prev = null;this.next = null;}
}

 

3,构建链表类,以增加节点和删除节点为例

public class DLink {int size;DNode first;DNode last;public DLink() {this.size = 0;this.first = null;this.last = null;}public boolean isEmpty() {return first == null;}public void addNode(Object o) {final DNode l = last;final DNode f = first;DNode newNode = new DNode(l, o, null);last = newNode;if (l == null) {first = newNode;first.next = newNode;last.prev = newNode;first.prev = newNode;} else {l.next = newNode;f.prev = newNode;newNode.prev = l;newNode.next = f;}size++;}public boolean removeNode(Object o) {if (o == null) {
            for (DNode x = first; x.next != first; x = x.next) {if (x.item == null) {unlink(x);return true;}}if (last.item == null) {unlink(last);return true;}} else {for (DNode x = first; x.next != first; x = x.next) {if (x.item.equals(o)) {unlink(x);return true;}if (last.item.equals(o)) {unlink(last);return true;}}}return false;}private void unlink(DNode e) {final DNode c = e;final DNode next = c.next;final DNode prev = c.prev;final DNode f = first;final DNode l = last;if (c == first) {first = f.next;first.prev = l;l.next = first;return;}if (c == last) {last = l.prev;last.next = first;first.prev = last;return;}prev.next = next;next.prev = prev;size--;}public void display() {for (DNode x = first; x.next != first; x = x.next) {System.out.println(x.prev.item + " <== " + x.item + " ==> " + x.next.item);}System.out.println(last.prev.item + " <== " + last.item + " ==> " + last.next.item);}// DNode x = first;// for (int i = 1; i <= DLink.size; i++) {// System.out.println(x.prev.item + " <== " + x.item + " ==> " +// x.next.item);// x = x.next;// }// }
}

 

4,构建测试类

public class DTest {public static void main(String[] args) {DLink dlink = new DLink();dlink.addNode("列兵");dlink.addNode("上等兵");dlink.addNode("下士");dlink.addNode("中士");dlink.addNode("上士");dlink.addNode("四级军士长");dlink.addNode("三级军士长");dlink.addNode("二级军士长");;dlink.addNode("一级军士长");dlink.addNode("少尉");dlink.addNode("中尉");dlink.addNode("中尉");dlink.addNode("上尉");dlink.addNode("少校");dlink.addNode("中校");dlink.addNode("上校");dlink.addNode("大校");dlink.addNode("少将");dlink.addNode("中将");dlink.addNode("上将");dlink.display();System.out.println("===============================================");dlink.removeNode(null);dlink.display();System.out.println("===============================================");// dlink.removeNode("列兵");// dlink.removeNode("上将");dlink.removeNode("中将");dlink.display();}
}



5,打印测试结果

 

上将 <== 列兵 ==> 上等兵
列兵 <== 上等兵 ==> 下士
上等兵 <== 下士 ==> 中士
下士 <== 中士 ==> 上士
中士 <== 上士 ==> 四级军士长
上士 <== 四级军士长 ==> 三级军士长
四级军士长 <== 三级军士长 ==> 二级军士长
三级军士长 <== 二级军士长 ==> 一级军士长
二级军士长 <== 一级军士长 ==> 少尉
一级军士长 <== 少尉 ==> 中尉
少尉 <== 中尉 ==> 中尉
中尉 <== 中尉 ==> 上尉
中尉 <== 上尉 ==> 少校
上尉 <== 少校 ==> 中校
少校 <== 中校 ==> 上校
中校 <== 上校 ==> 大校
上校 <== 大校 ==> 少将
大校 <== 少将 ==> 中将
少将 <== 中将 ==> 上将
中将 <== 上将 ==> 列兵
===============================================
上将 <== 列兵 ==> 上等兵
列兵 <== 上等兵 ==> 下士
上等兵 <== 下士 ==> 中士
下士 <== 中士 ==> 上士
中士 <== 上士 ==> 四级军士长
上士 <== 四级军士长 ==> 三级军士长
四级军士长 <== 三级军士长 ==> 二级军士长
三级军士长 <== 二级军士长 ==> 一级军士长
二级军士长 <== 一级军士长 ==> 少尉
一级军士长 <== 少尉 ==> 中尉
少尉 <== 中尉 ==> 中尉
中尉 <== 中尉 ==> 上尉
中尉 <== 上尉 ==> 少校
上尉 <== 少校 ==> 中校
少校 <== 中校 ==> 上校
中校 <== 上校 ==> 大校
上校 <== 大校 ==> 少将
大校 <== 少将 ==> 中将
少将 <== 中将 ==> 上将
中将 <== 上将 ==> 列兵
===============================================
上将 <== 列兵 ==> 上等兵
列兵 <== 上等兵 ==> 下士
上等兵 <== 下士 ==> 中士
下士 <== 中士 ==> 上士
中士 <== 上士 ==> 四级军士长
上士 <== 四级军士长 ==> 三级军士长
四级军士长 <== 三级军士长 ==> 二级军士长
三级军士长 <== 二级军士长 ==> 一级军士长
二级军士长 <== 一级军士长 ==> 少尉
一级军士长 <== 少尉 ==> 中尉
少尉 <== 中尉 ==> 中尉
中尉 <== 中尉 ==> 上尉
中尉 <== 上尉 ==> 少校
上尉 <== 少校 ==> 中校
少校 <== 中校 ==> 上校
中校 <== 上校 ==> 大校
上校 <== 大校 ==> 少将
大校 <== 少将 ==> 上将
少将 <== 上将 ==> 列兵

 

转载于:https://www.cnblogs.com/pickKnow/p/9593069.html

更多相关: