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

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

定义链表节点:

对于每一个链表节点,关键要素是节点自身数值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. CentOS7 搭建LVS+keepalived负载均衡

    1.实验环境 4台节点 Keepalived1 + lvs1(Director1):192.168.31.4 Keepalived2 + lvs2(Director2):192.168.31.3 Re ...

  2. mysql半同步开启

    开启半同步复制 #在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制 /etc/my.cnf plugin-load = "rpl_semi_sync_ ...

  3. 11204RAC-dbca建库脚本

    SET VERIFY OFFconnect "SYS"/"&&sysPassword" as SYSDBAset echo onspool /u ...

  4. C++ leetcode::ZigZag Conversion

    mmp,写完没保存,又得重新写.晚上写了简历,感觉身体被掏空,大学两年半所经历的事,一张A4纸都写不满,真是一事无成呢.这操蛋的生活到底想对我这个小猫咪做什么. 今后要做一个早起的好宝宝~晚起就诅咒自 ...

  5. 自建yum源解决Ceph搭建过程中从官网取包慢的问题

    最近项目组需要ceph环境,第一次搭建ceph,各种不顺,装了卸,卸了装,一遍又一遍地按照官网的操作进行.最气人的是网速差,从官网取包太慢.一轮尝试就浪费一上午. 因此想到本地新建yum源. 首先,按 ...

  6. FFmpeg点播慢的最终方案

    转载: 音视频交流群  发的一个总结.  原作者 请查看相关博客作者 http://blog.51cto.com/fengyuzaitu/2061036 场景要求 项目要求点播速度是300到500毫秒 ...

  7. Object转Integer,String

    object先转为字符串,然后通过int 的封装类(Integer)的pasreInt()方法转为int 例如: Object  ob = 123; Integer.parseInt(String.v ...

  8. 学习笔记-AngularJs(七)

    在学习笔记-AngularJs(六)提及了事件处理器和过滤器以及它们的例子,而我们知道之前我是使用$http服务去获得我们需要的json数据,但是$http是比较底层的用法,有时候我们想把获取json ...

  9. python---多线程与多进程

    一. 单进程多线程 1. 使用的模块是Threading.使用join()函数进行阻塞. from pdf2txt import pdfTotxt1, pdfTotxt2 import xlrd im ...

  10. am335x system upgrade uboot sd boot(一)

    由于上层应用的需求,需要运行arm docker,在kernel3.2上面还不支持,且编译器的glibc版本比较低的问题,故需要做系统升级 新的内核4.14.40驱动开发和以往有很大的不同,关键在于d ...