Java实现循环链表
本案例需要完成的任务定义如下:实现一个循环链表(单链表),具备增加元素、删除元素、打印循环链表等功能。
网上许多同类问题的实现方式过于复杂、难懂,本文旨在提出一种实现循环链表的简单、易懂的方法。
定义链表节点:
对于每一个链表节点,关键要素是节点自身数值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实现循环链表的更多相关文章
- java与数据结构(3)---java实现循环链表
循环链表:将单链表中尾结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种首尾相接的单链表称为单链表循环表,即循环链表. 循环链表与单链表最重要的区别是:尾结点的指针,不再是p->n ...
- java实现循环链表的增删功能
java实现循环链表的增删功能,完整代码 package songyan.test.demo; public class Demo { // java 实现循环链表 public static voi ...
- Java数据结构——循环链表
一.单向循环链表表中的最后一个节点的指针域指向头结点,整个链表形成一个环.其他的与单链表相同. (以下图片均来自网络,侵删) 插入操作 删除操作 简单实现 public class CiNode { ...
- Java数据结构——循环链表的实现
//单链表结点类 public class Node<T> { //单链表结点类,T指定结点的元素类型 public T data; //数据域,保存数据元素 public Node< ...
- java实现双向循环链表
java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html 在单链表中,查询下一个元素的时间是O(1).查询上一个元素的时间却是O(n). 为 ...
- 数据结构Java实现04----循环链表、仿真链表
单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java程序设计之循环链表
照例来说点废话,愿自己生一颗温柔细腻的心,这样女朋友也许一个眼神,一个微笑,我就知道如何做,可惜内心与外表一样粗糙,这一生有幸认识她,愿天下有情人终成眷属. 循环链表,顾名思义循环就好了,所以建一个线 ...
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
随机推荐
- React文档(二)Hello World
开始学习React最简单的实践就是去试一试CodePen上面的Hello World程序.你不需要安装任何东西,只要新开一个标签页打开例子依照原例操作即可.如果你更喜欢在本地开发,那么来看看安装的介绍 ...
- windos 开启openssl
前面我使用的是wampserver百度提示的软件,然后我卸载了,自己重新再官网上下载了一个比较新的版本,然后我按照的时候用默认路径,他的的都不用怎么配置,新版本都给你弄好了. 低版本的要在httped ...
- server library[unbound] 服务未绑定解决办法
情景如下:
- [Codeforces Round #340 (Div. 2)]
[Codeforces Round #340 (Div. 2)] vp了一场cf..(打不了深夜的场啊!!) A.Elephant 水题,直接贪心,能用5步走5步. B.Chocolate 乘法原理计 ...
- 十七、Spring框架(IOC/DI)
一.Spring框架 Spring是一个基于IOC和AOP的结构J2EE系统的框架. 1.IOC反转控制是Spring的基础(Inversion Of Control).也就是说创建对象由以前的程序员 ...
- Uboot代码分析
(1)确定链接脚本文件:uboot根目录下Makefile中的LDSCRIPT宏值,就是指定链接脚本(如:arch/arm/cpu/u-boot.lds)路径用的.(2)从脚本文件找入口: 在链接脚本 ...
- Linux运维工程师需要掌握什么才能胜任工作呢
万丈高楼平地起,所有一切的高深的技术都离不开最基本的技术,那么作为运维工程师的你,什么是最基本的技术呢,毫无疑问是Linux,Linux 是你所有一切技术的根源,试想一下如果你连基础的操作命令都不知道 ...
- nginx入门示例(二)
nginx使用域名访问 (Tip) nginx目录解析 conf/nginx.conf #主要的配置文件目录 html #nginx的默认发布目录,部署完后 网站会在这个目录 ...
- wordpress有用的插件
代码高亮 https://wordpress.org/plugins/crayon-syntax-highlighter/ 这个貌似比较好用 百度UEditor(富文本编辑器) https://www ...
- C++中重载(overload)、覆盖(override)与隐藏(oversee)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...