1.创建循环双链表节点
1 package com.neusoft.link; 2 /** 3 * @author zhao-chj 4 *双向循环链表节点类 5 */ 6 public class DulNode { 7 public Object data; 8 public DulNode prior; 9 public DulNode next; 10 public DulNode() {//无参构造函数 11 this(null); 12 } 13 public DulNode(Object data) {//构造值为data的节点 14 this.data=data; 15 this.prior=null; 16 this.next=null; 17 } 18 }
2.循环双链表的各种操作
1 package com.neusoft.link; 2 3 import java.util.Scanner; 4 5 import com.neusoft.List.IList; 6 7 public class DulList implements IList { 8 public DulNode head; 9 public DulNode getHead() { 10 return head; 11 } 12 public void setHead(DulNode head) { 13 this.head = head; 14 } 15 public DulList() { 16 // TODO 构造方法初始化头结点及前驱和后继 17 head=new DulNode(); 18 head.prior=head;//head的前驱指向head 19 head.next=head;//head的后继指向head 20 } 21 /** 22 * 创建从表尾到表头逆向建立双向链表的算法。n为双向链表元素的个数 23 * @param n 24 */ 25 public DulList(int n){ 26 this(); 27 System.out.println("请您输入双向链表的元素~"); 28 Scanner sc = new Scanner(System.in); 29 for (int i = 0; i < n; i++) { 30 insert(0, sc.next());//生成新节点插入到表头 31 } 32 } 33 @Override 34 public void clear() { 35 // TODO 置空 36 head.prior=head; 37 head.next=head; 38 } 39 @Override 40 public boolean isEmpty() { 41 // TODO 判空,head=head.next时候即为空 42 return head.equals(head.next); 43 } 44 @Override 45 public int length() { 46 // TODO 求长度 47 DulNode p=head.next; 48 int length=0; 49 while (!p.equals(head)) {//判断是否为空 50 p=p.next; 51 length++; 52 } 53 return length; 54 } 55 56 @Override 57 public Object get(int i) { 58 // TODO 读取循环双链表的第i个数据元素 59 DulNode p=head.next; 60 int j=0; 61 while (!p.equals(head)) { 62 p=p.next; 63 j++; 64 } 65 if (j>i||p.equals(head)) { 66 System.out.println("查找元素不存在"); 67 } 68 return p.data; 69 } 70 71 @Override 72 public void insert(int i, Object x) { 73 // TODO 在双向循环链表的第i个数据元素之前插入一个值为x的节点, 74 //i等于表长时候,p指向头结点;i>表长时候,p=null 75 DulNode p=head.next; 76 int j=0; 77 while (!p.equals(head)&&j<i) {//寻找插入位置i 78 p=p.next; 79 j++; 80 } 81 if (j!=i&&!p.equals(head)) { 82 System.out.println("插入位置不合法"); 83 } 84 DulNode s=new DulNode(x); 85 p.prior.next=s; 86 s.prior=p.prior; 87 s.next=p; 88 p.prior=s; 89 } 90 @Override 91 public void remove(int i) { 92 // TODO 删除双链表的第i个数据元素。注意长度取值 93 DulNode p = head.next; 94 int j=0; 95 while (!p.equals(head)&&j<i) {//寻找第i个元素 96 p=p.next; 97 j++; 98 } 99 if (j!=i) { 100 System.out.println("删除位置不合理"); 101 } 102 p.prior.next=p.next; 103 p.next.prior=p.prior; 104 } 105 106 @Override 107 public int indexOf(Object x) { 108 // TODO 在循环双链表中查找值为x的元素,找到返回其位置 109 DulNode p = head.next; 110 int j=0; 111 while (!p.equals(head)&&!p.data.equals(x)) { 112 p=p.next; 113 j++; 114 } 115 if (!p.equals(head)) { 116 return j;//返回其位置 117 }else { 118 System.out.println("不存在该元素"); 119 return -1; 120 } 121 } 122 123 @Override 124 public void display() { 125 // TODO 显示循环双链表 126 DulNode p = head.next; 127 while (!p.equals(head)) { 128 System.out.print(p.data+" "); 129 p=p.next; 130 } 131 System.out.println(); 132 } 133 134 @Override 135 public int remove(Object i) { 136 // TODO Auto-generated method stub 137 return 0; 138 } 139 140 }
3.测试循环双链表类
1 package com.neusoft.link; 2 /** 3 * @author zhao-chj 4 * 循环双链表的测试 5 */ 6 public class DebugDuList { 7 public static void main(String[] args) { 8 //-------调用构造方法---------------- 9 System.out.println("************执行构造方法**************"); 10 System.out.println("请您输入3个双向循环链表的数据元素"); 11 DulList L = new DulList(3); 12 System.out.println("双向循环链表中各个数据元素~"); 13 L.display(); 14 //-------调用length()求顺序表的长度----- 15 System.out.println("************执行length()方法**************"); 16 System.out.println("双向循环链表的长度为:"+L.length()); 17 //-------调用get(int i)取出第i个元素--------- 18 System.out.println("************执行get(int i)方法**************"); 19 if (L.get(2)!=null) { 20 System.out.println("双向循环链表中第2个元素为:"+L.get(2)); 21 }else { 22 System.out.println("双向循环链表中第2个元素不存在"); 23 } 24 //-------调用indexOf(Object x)查找x元素所在的位置------- 25 System.out.println("************执行indexOf(Object x)方法**************"); 26 int order = L.indexOf("c"); 27 if (order !=-1) { 28 System.out.println("双向循环链表中字符串为c的数据元素位置:"+order); 29 }else { 30 System.out.println("字符'c'不在促双向循环链表中"); 31 } 32 //------remove(int i)删除数据元素------ 33 System.out.println("************执行remove(int i)方法**************"); 34 L.remove(2); 35 System.out.println("删除第2个位置的数据之后双向循环链表的个个数据元素为:"); 36 L.display(); 37 //----insert(int i,Object x)插入数据元素---------- 38 System.out.println("************执行insert(int i,Object x)方法**************"); 39 L.insert(2, 'd'); 40 System.out.println("在2的位置上插入数据元素d之后双向循环链表的各个元素为:"); 41 L.display(); 42 //------调用L.clear()将顺序置空------- 43 System.out.println("************执行L.clear()方法**************"); 44 L.clear(); 45 System.out.println("将双向循环链表置空之后再打印数据元素:"); 46 //-------isEmpty()判空操作----------- 47 System.out.println("************执行isEmpty()方法**************"); 48 if (L.isEmpty()) { 49 System.out.println("双向链表为空"); 50 }else { 51 System.out.println("双向链表不为空,双向循环链表的各个元素为:"); 52 L.display(); 53 } 54 System.out.println("************END**************"); 55 } 56 }
4.循环双链表测试