Java数据结构——循环链表的实现

Posted 薄荷加冰1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java数据结构——循环链表的实现相关的知识,希望对你有一定的参考价值。

 

 1 //单链表结点类
 2 public class Node<T> {             //单链表结点类,T指定结点的元素类型
 3 
 4     public T data;                 //数据域,保存数据元素
 5     public Node<T> next;           //地址域,后任结点引用
 6 
 7     //构造结点,data指定数据元素,next指定后继结点
 8     public Node(T data, Node<T> next) {
 9         this.data = data;
10         this.next = next;
11     }
12 
13     public Node() {
14         this(null, null);
15     }
16 
17     //返回结点对应的字符串
18     public String toString() {
19         return this.data.toString();
20     }
21 
22     //比较两个结点值是否相等,覆盖Object类的equals(obj)方法
23     public boolean equals(Object obj) {
24         return obj == this || obj instanceof Node && this.data.equals(((Node<T>) obj).data);
25     }
26 }

 

 1 //循环单链表类,实现线性表接口
 2 public class LoopLinkList<T> {
 3 
 4     //头指针,指向循环单链表的头结点
 5     public Node<T> head;
 6 
 7     //默认构造方法,构造空循环单链表
 8     public LoopLinkList() {
 9         this.head = new Node<T>();
10         this.head.next = this.head;  ////创建头结点
11     }
12 
13     //判断循环单链表是否空
14     public boolean isEmpty() {
15         return this.head.next == this.head;
16     }
17 
18     //由element数组中的多个对象构造单链表。采用尾插入构造单链表
19     public LoopLinkList(T[] element) {
20         this();                                                  //创建空单链表,只有头结点
21         Node<T> rear = this.head;                                //rear指向单链表最后一个结点
22         for (int i = 0; i < element.length; i++) {               //若element==null,抛出空对象异常
23             //若element.length==0,构造空链表
24             rear.next = new Node<T>(element[i], this.head);      //尾插入,创建结点链入rear结点之后
25             rear = rear.next;                                    //rear指向新的链尾结点
26         }
27     }
28 
29     //返回循环单链表长度,单链表遍历算法,O(n)
30     public int length() {
31         int i = 0;
32         for (Node<T> p = this.head.next; p != this.head; p = p.next)
33             i++;
34         return i;
35     }
36 
37     //返回第i(≥0)个元素,若i<0或大于表长则返回null,O(n)
38     public T get(int i) {
39         if (i >= 0) {
40             Node<T> p = this.head.next;
41             for (int j = 0; p != this.head && j < i; j++)
42                 p = p.next;
43             if (p != this.head)
44                 return p.data;                             //p指向第i个结点
45         }
46         return null;                                       //当i<0或大于表长时
47     }
48 
49     //设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)
50     public void set(int i, T x) {
51         if (x == null) return;                              //不能设置空对象
52         Node<T> p = this.head.next;
53         for (int j = 0; p != this.head && j < i; j++)
54             p = p.next;
55         if (i >= 0 && p != this.head)
56             p.data = x;                                    //p指向第i个结点
57         else throw new IndexOutOfBoundsException(i + "");    //抛出序号越界异常
58     }
59 }

 

 1  public static void main(String args[]){
 2 
 3         Integer[] array=new Integer[]{12,25,55,78,99,-17};
 4         LoopLinkList<Integer> linkList =new  LoopLinkList<Integer>(array);
 5 
 6         int length=linkList.length();
 7         int a=linkList.get(5);
 8 
 9         System.out.println("链表是否为空:"+linkList.isEmpty());
10         System.out.println("链表长度是:"+length);
11         System.out.println("获取指定位置的数据是:"+a);
12 
13         for(int i=0;i<length;i++)
14             System.out.println(linkList.get(i));
15 
16         linkList.set(1,200);
17 
18         for(int i=0;i<length;i++)
19             System.out.println(linkList.get(i));
20     }

 

以上是关于Java数据结构——循环链表的实现的主要内容,如果未能解决你的问题,请参考以下文章

(java实现)双向循环链表

Java数据结构——循环链表的实现

《链表》之带头双向循环链表

数据结构开发(11):双向循环链表的实现

Java实现双向循环链表的基本操作

数据结构——循环链表