//单链表结点类
public class Node<T> { //单链表结点类,T指定结点的元素类型 public T data; //数据域,保存数据元素
public Node<T> next; //地址域,后任结点引用 //构造结点,data指定数据元素,next指定后继结点
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
} public Node() {
this(null, null);
} //返回结点对应的字符串
public String toString() {
return this.data.toString();
} //比较两个结点值是否相等,覆盖Object类的equals(obj)方法
public boolean equals(Object obj) {
return obj == this || obj instanceof Node && this.data.equals(((Node<T>) obj).data);
}
}
 //循环单链表类,实现线性表接口
public class LoopLinkList<T> { //头指针,指向循环单链表的头结点
public Node<T> head; //默认构造方法,构造空循环单链表
public LoopLinkList() {
this.head = new Node<T>();
this.head.next = this.head; ////创建头结点
} //判断循环单链表是否空
public boolean isEmpty() {
return this.head.next == this.head;
} //由element数组中的多个对象构造单链表。采用尾插入构造单链表
public LoopLinkList(T[] element) {
this(); //创建空单链表,只有头结点
Node<T> rear = this.head; //rear指向单链表最后一个结点
for (int i = 0; i < element.length; i++) { //若element==null,抛出空对象异常
//若element.length==0,构造空链表
rear.next = new Node<T>(element[i], this.head); //尾插入,创建结点链入rear结点之后
rear = rear.next; //rear指向新的链尾结点
}
} //返回循环单链表长度,单链表遍历算法,O(n)
public int length() {
int i = 0;
for (Node<T> p = this.head.next; p != this.head; p = p.next)
i++;
return i;
} //返回第i(≥0)个元素,若i<0或大于表长则返回null,O(n)
public T get(int i) {
if (i >= 0) {
Node<T> p = this.head.next;
for (int j = 0; p != this.head && j < i; j++)
p = p.next;
if (p != this.head)
return p.data; //p指向第i个结点
}
return null; //当i<0或大于表长时
} //设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)
public void set(int i, T x) {
if (x == null) return; //不能设置空对象
Node<T> p = this.head.next;
for (int j = 0; p != this.head && j < i; j++)
p = p.next;
if (i >= 0 && p != this.head)
p.data = x; //p指向第i个结点
else throw new IndexOutOfBoundsException(i + ""); //抛出序号越界异常
}
}
  public static void main(String args[]){

         Integer[] array=new Integer[]{12,25,55,78,99,-17};
LoopLinkList<Integer> linkList =new LoopLinkList<Integer>(array); int length=linkList.length();
int a=linkList.get(5); System.out.println("链表是否为空:"+linkList.isEmpty());
System.out.println("链表长度是:"+length);
System.out.println("获取指定位置的数据是:"+a); for(int i=0;i<length;i++)
System.out.println(linkList.get(i)); linkList.set(1,200); for(int i=0;i<length;i++)
System.out.println(linkList.get(i));
}

Java数据结构——循环链表的实现的更多相关文章

  1. Java数据结构——循环链表

    一.单向循环链表表中的最后一个节点的指针域指向头结点,整个链表形成一个环.其他的与单链表相同. (以下图片均来自网络,侵删) 插入操作 删除操作 简单实现 public class CiNode { ...

  2. java与数据结构(3)---java实现循环链表

    循环链表:将单链表中尾结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种首尾相接的单链表称为单链表循环表,即循环链表. 循环链表与单链表最重要的区别是:尾结点的指针,不再是p->n ...

  3. Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

    Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...

  4. Java数据结构之线性表(2)

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  5. Java数据结构之线性表

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  6. Java数据结构和算法(一)线性结构

    Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...

  7. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  8. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  9. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

随机推荐

  1. InstallSheild 获取系统环境变量,如Desktop路径等

    使用FOLDER_DESKTOP变量获取的桌面路径可能为:C:\Users\Public\Desktop 而不是C:\Users\用户\Desktop Copy and paste the follo ...

  2. yii 常用orm

    yii2 orwhere andwhere的复杂写法:https://www.codercto.com/a/6513.html $files = XXXX::find() ->andWhere( ...

  3. jquery书写一个简易的二级联动

    先用php生成一个json数组示例如下 JSON_UNESCAPED_UNICODE 是对汉字进行处理的参数 然后HTML代码如下 把那个json_city赋值成我们用php生成的json即可 < ...

  4. Linux命令之乐--read

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 -p:后接屏幕输出的提示语句 -n:设定输入的字符个数,当达到指定的个数则自动退出,并将输入赋予给变量 -t:当输 ...

  5. 如何优化JAVA代码及提高执行效率

    可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代 ...

  6. 移动端form表单

    始终绑定submit事件 不单独的对[提交]按钮绑定click事件,对整个表单绑定submit提交事件,这样可以让整个表单内的文本框获得Enter提交的VIP待遇,并且在移动端中可以让文本框聚焦时键盘 ...

  7. EditText监听方法,实时的判断输入多少字符

    最近在写一个小项目,其中有一点用到了显示EditText中输入了多少个字符,像微博中显示剩余多少字符的功能.在EditText提供了一个方法addTextChangedListener实现对输入文本的 ...

  8. XStream别名;元素转属性;去除集合属性(剥皮);忽略不需要元素

    city package xstream; public class City { private String name; private String description; public St ...

  9. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  10. jquery页面滚动显示浮动菜单栏锚点定位效果

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...