1.双向循环链表的优缺点
和单向循环链表类似,但是可以直接访问某个结点的直接前驱和直接后继,比较方便。
2.实现思路
采用内部类的方式实现,Link为外部链表类,Node为内部结点类。外部类定义宏观上的方法和调用内部类的方法,内部类定义对结点的操作方法。
3.实现细节和注意要点
1.还是始终要铭记链表没有下标,每次要使用下标都是从头开始遍历,这里定义的是index,每次需要使用的时候记得一定要初始化。
2.这里将链表转化为数组输出,需要动态的申请数组,所以再调用转化成数组输出的方法的时候,一定一定一定要记得new.
1 package Doublelink; 2 /** 3 * @类名 Link.java 4 * @作者 修仙小华 5 * @版本 V1.0 6 * @日期 2019年7月22日-下午1:02:27 7 * @描述 8 * 9 */ 10 public class Link { 11 int count=0; 12 int index=0; 13 String arrayList[]; 14 Node header=new Node(); 15 16 public void init() { 17 header.data=null; 18 header.root=header; 19 header.next=header; 20 } 21 22 /** 23 * 根据输入下标返回当前结点的直接前驱和直接后继 24 */ 25 public String returnRootNext(int index) { 26 this.index=0; 27 if (header.next==header) { 28 return null; 29 }else { 30 return header.next.returnRootNextNode(index); 31 } 32 } 33 /** 34 * 增加结点的方法 35 */ 36 public void add(String data) { 37 Node node=new Node(data); 38 this.count++; 39 if (header.next==header) { 40 header.next=node; 41 header.root=node; 42 node.root=header; 43 node.next=header; 44 }else { 45 header.next.addNode(node); 46 } 47 } 48 /** 49 * 通过下标查找数据 50 */ 51 public String get(int index) { 52 this.index=0; 53 if (index<0||index>count-1) { 54 return null; 55 }else { 56 return header.next.getNode(index); 57 } 58 } 59 /** 60 * 判断链表是否为空 61 * @return 62 */ 63 public boolean isEmparty() { 64 if (header.next==header) { 65 return true; 66 }else { 67 return false; 68 } 69 } 70 /** 71 * 将链表转化成数组输出 72 */ 73 public void array() { 74 this.index=0; 75 arrayList=new String[count]; 76 if (this.isEmparty()) { 77 return; 78 }else { 79 header.next.arrayNode(); 80 } 81 for (int i = 0; i < arrayList.length; i++) { 82 System.out.print(arrayList[i]+" "); 83 } 84 System.out.println(); 85 86 } 87 //================================================================= 88 class Node{ 89 String data; 90 Node next; 91 Node root; 92 /** 93 * 构造方法 94 */ 95 public Node() { 96 97 } 98 /** 99 * 根据输入下标返回当前结点的直接前驱和直接后继 100 * @return 101 */ 102 public String returnRootNextNode(int index) { 103 if (Link.this.index++ ==index) { 104 return this.root.data+" "+this.next.data; 105 }else { 106 return this.next.returnRootNextNode(index); 107 } 108 109 } 110 /** 111 *通过下标查找数据 112 */ 113 public String getNode(int index) { 114 if (Link.this.index++ ==index) { 115 return this.data; 116 }else { 117 return this.next.getNode(index); 118 } 119 120 } 121 public Node(String data) { 122 this.data=data; 123 } 124 /** 125 * 将链表转化为数组输出 126 */ 127 public void arrayNode() { 128 Link.this.arrayList[Link.this.index++]=this.data; 129 if (this.next!=header) { 130 this.next.arrayNode(); 131 } 132 } 133 134 /** 135 * 增加结点的方法 136 */ 137 public void addNode(Node node) { 138 if (this.next==header) { 139 this.next=node; 140 node.root=this; 141 node.next=header; 142 header.root=node; 143 144 }else { 145 this.next.addNode(node); 146 } 147 148 } 149 150 } 151 }
测试类:
public class LinkTest { public static void main(String[] args) { Link link=new Link(); link.init(); link.add("袁帅"); link.add("袁丑"); link.add("袁美"); link.add("袁丧"); link.add("袁泉"); // System.out.println(link.get(0)); // System.out.println(link.get(1)); // System.out.println(link.get(2)); // System.out.println(link.get(3)); // System.out.println(link.get(4)); // // link.isEmparty(); link.array(); System.out.println(link.returnRootNext(1)); } }