Java数据结构——循环链表的实现
//单链表结点类
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数据结构——循环链表的实现的更多相关文章
- Java数据结构——循环链表
一.单向循环链表表中的最后一个节点的指针域指向头结点,整个链表形成一个环.其他的与单链表相同. (以下图片均来自网络,侵删) 插入操作 删除操作 简单实现 public class CiNode { ...
- java与数据结构(3)---java实现循环链表
循环链表:将单链表中尾结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种首尾相接的单链表称为单链表循环表,即循环链表. 循环链表与单链表最重要的区别是:尾结点的指针,不再是p->n ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- Java数据结构之线性表(2)
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构之线性表
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构和算法(一)线性结构
Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
随机推荐
- 自动化测试的组成部分:SEARCH
在考虑自动化测试用例时,不仅仅要考虑测试的执行步骤.在运行任何步骤之前,程序必须处在能够执行测试的状态.在测试执行后,至关重要的是知道测试是否通过,并且测试结果一定要被保存到某处以待检查或进一步分析. ...
- hdu 1358:Period(KMP算法,next[]数组的使用)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Pecan
什么是peacn Pecan是一个轻量级的基于Python的Web框架, Pecan的目标并不是要成为一个“full stack”的框架, 因此Pecan本身不支持类似Session和Database ...
- JQuery------制作div模态框
转载: http://blog.csdn.net/li_xiao_ming/article/details/6738922 如图: 代码: html(使用opacity的话content无法变为不透明 ...
- Spring_day02--AOP概念、原理、操作术语
AOP概念 hibernate要手动进行事务操作,在spring中通过配置文件来配置事务 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体 ...
- THINKPHP5加载公共头部尾部模板方法
之前在3.2中用 <include file="public/header" /> 后来发现在thinkphp5中应该这样写才行 {include file=" ...
- Java反序列化漏洞的挖掘、攻击与防御
一.Java反序列化漏洞的挖掘 1.黑盒流量分析: 在Java反序列化传送的包中,一般有两种传送方式,在TCP报文中,一般二进制流方式传输,在HTTP报文中,则大多以base64传输.因而在流量中有一 ...
- GitHubDesktop的使用方法
author:headsen chen date:2018-05-30 17:24:55 notice:This article is created by headsen chen hims ...
- 【BZOJ3438】小M的作物 最小割
[BZOJ3438]小M的作物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...
- Java IO 修改文件名
/** *//**文件重命名 * @param path 文件目录 * @param oldname 原来的文件名 * @param newname 新文件名 */ public void renam ...