本案例需要完成的任务定义如下:实现一个循环链表(单链表),具备增加元素、删除元素、打印循环链表等功能。

网上许多同类问题的实现方式过于复杂、难懂,本文旨在提出一种实现循环链表的简单、易懂的方法。

定义链表节点:

对于每一个链表节点,关键要素是节点自身数值data以及所指向的下一个节点next。

package circularLinkedList;

public class Node {
//元素类型为int的节点
private int data;
private Node next;
//定义构造器
public Node(int i, Node nt){
data = i;
next = nt;
}
public Node(int i){
this(i,null);
}
public Node(){
this(0,null);
}
//更改元素数值
public void setData(int i){
data = i;
}
//读取元素数值
public int getData(){
return data;
}
//更改元素的指向
public void setNext(Node nt){
next = nt;
}
//读取元素的指向
public Node getNext(){
return next;
}
}

定义循环链表:

对于循环链表而言,关键要素是指定链表的头节点head、尾节点tail以及链表大小size;该数据结构支持在头部增加节点、在尾部增加节点,从头部删除节点及从尾部删除节点等。

package circularLinkedList;

public class Linkedlst {
private Node head;
private Node tail;
int size;
//构造器
public Linkedlst(){
tail = head = null;
size = 0;
} //在链表头部增加节点
public void addHead(Node hd){
//如果使用该方法增加链表的第一个节点,则head=tail=hd,且next指向自身。
if(size==0){
hd.setNext(hd);
tail = head = hd;
size++;
}
else{
tail.setNext(hd);
hd.setNext(head);
head = hd;
size++;
}
} //在链表尾部增加节点
public void addTail(Node tl){
//如果使用该方法增加链表的第一个节点,则tail=head= hd,且next指向自身。
if(size==0){
tl.setNext(tl);
tail = head = tl;
size++;
}
else{
tail.setNext(tl);
tl.setNext(head);
tail = tl;
size++;
}
} //删除头部节点,被删掉的head将被自动回收
public void delHead(){
if(size>1){
head = head.getNext();
tail.setNext(head);
size--;
}
else if(size==1){
head = tail = null;
size--;
}
else{
System.out.println("There is no elements in the linked list.");
}
} //删除尾部节点
public void delTail(){
if(size>1){
Node nd = new Node();
nd = head;
while(nd.getNext()!=tail){
nd = nd.getNext();
}
nd.setNext(head);
size--;
}
else if(size==1){
head = tail = null;
size--;
}
else{
System.out.println("There is no elements in the linked list.");
}
} //打印全部节点
public void printList(){
Node nd = new Node();
nd = head;
try{
while(nd.getNext()!=head){
System.out.print(nd.getData());
System.out.print("->");
nd = nd.getNext();
}
System.out.print(nd.getData());
System.out.print("->");
System.out.print(head.getData());
}
catch(Exception e){
e.printStackTrace();
} }
}

测试程序:

测试了打印循环链表元素、删除首端节点等方法,运行正常。

package circularLinkedList;

public class LinkedlstTest {

	public static void main(String[] args) {
// TODO Auto-generated method stub
Linkedlst lst = new Linkedlst();
Node head = new Node(11,null);
lst.addHead(head);
lst.addTail(new Node(22));
lst.addTail(new Node(33));
System.out.println("打印链表:");
lst.printList();
System.out.println();
System.out.println("删除首端节点:");
lst.delHead();
lst.printList();
System.out.println();
System.out.println("删除首端节点:");
lst.delHead();
lst.printList();
} }

Java实现循环链表的更多相关文章

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

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

  2. java实现循环链表的增删功能

    java实现循环链表的增删功能,完整代码 package songyan.test.demo; public class Demo { // java 实现循环链表 public static voi ...

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

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

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

    //单链表结点类 public class Node<T> { //单链表结点类,T指定结点的元素类型 public T data; //数据域,保存数据元素 public Node< ...

  5. java实现双向循环链表

    java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html 在单链表中,查询下一个元素的时间是O(1).查询上一个元素的时间却是O(n). 为 ...

  6. 数据结构Java实现04----循环链表、仿真链表

    单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形 ...

  7. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  8. java程序设计之循环链表

    照例来说点废话,愿自己生一颗温柔细腻的心,这样女朋友也许一个眼神,一个微笑,我就知道如何做,可惜内心与外表一样粗糙,这一生有幸认识她,愿天下有情人终成眷属. 循环链表,顾名思义循环就好了,所以建一个线 ...

  9. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

随机推荐

  1. Java编码 蛇形矩阵的构建与遍历输出

    一.蛇形矩阵的构建,并按行输出 例: 输入:n, 生成n*n的蛇形矩阵 1 2 3 8 9 4 7 6 5 输出:1 2 3 8 9 4 7 6 5 java编码 public static void ...

  2. 『TensorFlow』高级高维切片gather_nd

    gather用于高级切片,有关官方文档的介绍,关于维度的说明很是费解,示例也不太直观,这里给出我的解读,示例见下面,     indices = [[0, 0], [1, 1]]    params ...

  3. DHCP机制

    DHCP概念:局域网的网络协议,使用UDP协议工作,在工作过程中,它有两个对象,DHCP客户端和DHCP服务端,DHCP服务运行在67端口和68端口. 用途:1)个内部网络或网络服务供应商自动分配IP ...

  4. input事件在ie9以下不兼容问题完美解决

    上周四好不容易加了几天班把刚接手的一个pc页面做完,周五同事说要兼容ie7~ie9,结果在上面一跑,输入都没法输入. 我的需求是用6个span作为虚拟的密码输入框,实际上是用一个藏在页面里的input ...

  5. oracle having sum group by 详解

    Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...

  6. Oracle表空间状态

    1.表空间只读 查看当前表空间状态 SYS@userdata>column file_name format a60 SYS@userdata>column tablespace_name ...

  7. Oracle 11.2.0.4.0 Dataguard部署和日常维护(7) - Dataguard Flashback篇

    1. 设置备库的闪回目录 show parameter db_recovery_file; NAME TYPE VALUE ------------------------------------ - ...

  8. Git:合并分支冲突问题

    首先创建分支feature1,并且修改readme.txt内容,再在该分支上提交. 切换回master分支, 并且修改readme.txt内容,再在master分支上提交. 此时的分支路线如下,合并时 ...

  9. const 内联 枚举 宏

    const 常量   程序运行时在常量表中,系统为它分配内存,在堆栈分配了空间:const常量有数据类型:语句末有分号:有类型检查:可以限制范围 //将所有不希望改变的变量加const修饰 const ...

  10. 记一次搭建vsftp服务器坑

    避免踩坑,特此记录... yum -y install vsftpd useradd -d /www -s /sbin/nologin sui # 修改vsftpd配置文件/etc/vsftpd/vs ...