//单链表结点类
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. jQuery 插件开发指南

    jQuery凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,经常有人询问一些技巧,因此干脆写这么一篇文章给各位jQuery爱好者,算是抛砖引玉吧. 那么首先我们来简单 ...

  2. hdu 3085(双向bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 思路:双向广搜,每次从M出发,搜三步,从G出发,搜一步,然后就是判断是否走到对方已经走过的格子, ...

  3. AWS系列-EC2实例添加磁盘

    注意:添加的磁盘,必须和挂载的实例是在同一可用区. 1.1 如下图,打开EC2控制台,打开卷,点击创建卷 1.2 选择磁盘配置 磁盘类型:如下图 磁盘大小:如图,最小500G,最大16T 可用区:注意 ...

  4. 状态栏,ActionBar,工具栏高度调整

    1.在属性中可以这样设置更改ActionBar的高度android:layout_marginTop="?android:attr/actionBarSize" Rect fram ...

  5. VS2010类模板更改,增加版权等等信息

    本文转载自XDOTNET 在开发过程中往往需要在每一个页面(类)增加注释等等内容,VS2010中可以修改模板,在原有模板中增加一个类,会引用System等等命名空间,以及一些程序集.下面我们来看看如何 ...

  6. Fiddler实现手机抓包——小白入门 - 做一个不动声色的大人

    手机用fiddler抓包 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置    1. 配置fiddler允许监听到https(fiddle ...

  7. webpack——html-webpack-plugin

    一开始考虑到浏览器的缓存问题,所以给打包的文件都带了.[hash],但是,这之后,index.html文件中的引入并没有哈希值,所以,就用到了下面的信插件: html-webpack-plugin可以 ...

  8. 怎么在android实现通过浏览器点击链接打开apk

    intent://scan/#Intent;scheme=appname://appname/[频道]/[id];package=com.appname.package;end http://m.ch ...

  9. js i++ 与 ++i 的区别

    转载:http://blog.csdn.net/hjb2722404/article/details/50423804 在javascript中,我们常常搞不懂i++与++i的区别,今天我们就来简单说 ...

  10. Java8 新特性之Stream API

    1. Stream 概述 Stream 是Java8中处理集合的关键抽象概念,可以对集合执行非常复杂的查找,过滤和映射数据等操作; 使用 Stream API 对集合数据进行操作,就类似于使用 SQL ...