循环双链表的应用

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.循环双链表测试

      

原文地址:https://www.cnblogs.com/jackchen-Net/p/6591598.html