java 单向循环链表_单向循环链表(Java版)

单向循环链表(Java版)

单向循环链表(Java版)

前面的文章中介绍到单链表,它的尾结点(最后一个结点)的指针域next都是指向null,如下图:

373e896db1e416c6825ae126572be05a.png

单链表的指针域只存储了向后的指针,到了尾结点就无法继续向后的操作。

本篇文章将介绍单向循环链表,它和单链表的区别在于结尾点的指针域不是指向null,而是指向头结点,形成首尾相连的环。这种首尾相连的单链表称为单向循环链表。循环链表可以从任意一个结点出发,访问到链表中的全部结点。

354e85e53433d81b257adf9d09feb75b.png

和单链表一样,为了使空链表与非空链表处理一致,我们通常会设置一个头结点。当然,之前提到的单链表和本文的单向循环链表都不是必须要有头结点,只是为了简化操作。

单向循环链表的查找、删除和修改操作与单链表一致(这里不在赘述,可参考前面的文章),插入操作和单链表有所不同,单向循环链表需要维持环状结构。判断单链表为空的条件是head.next == null,而判断单向循环链表为空的条件为head.next == head。如下图所示,单向循环链表初始化时,头结点的next域指向自身,形成环状结构。

e9c94708ed46c87e6932c58209defee6.png

public SingleCycleLinkedList() {

head = new Node();

// 初始化时头结点的next域指向自身,形成环

head.next = head;

}

比如现在要在尾部插入结点a,如下:

8a71d6cca95bc8d0b2e0edf15fcce418.png

首先遍历链表找到尾结点,那么如何找到这个尾结点呢,我们知道单向循环链表中尾结点的next域指向头结点,所以当tmp.next == head的时候tmp指向的就是尾结点。

// 找到尾结点

Node tmp = head;

while (tmp.next != head) {

tmp = tmp.next;

}

插入操作的完整代码如下,仅供参考

public class SingleCycleLinkedList {

// 头结点

private Node head;

public SingleCycleLinkedList() {

head = new Node();

// 初始化时头结点的next指向自身

head.next = head;

}

public boolean add(Integer item) {

// 新创建一个结点

Node newNode = new Node(item, null);

// 找到尾结点

Node tmp = head;

while (tmp.next != head) {

tmp = tmp.next;

}

// 这个时候tmp指向尾结点(即tmp.next = head),新结点的next指向head。

newNode.next = tmp.next;

tmp.next = newNode;

return true;

}

public void list() {

Node tmp = head;

while (tmp.next != head) {

tmp = tmp.next;

System.out.println(tmp.item);

}

}

private static class Node {

private Integer item;

private Node next;

public Node() {

}

public Node(Integer item, Node next) {

this.item = item;

this.next = next;

}

}

}

上述代码的插入操作,为了找到尾结点每次都要从头开始遍历链表,效率很低。我们可以定义一个尾指针指向链表的尾结点来进行优化,这样每次插入操作的时间复杂度就变成了O(1)。

在下一篇文章中,我会使用单向循环链表解决约瑟夫问题,其中就会用到尾指针,敬请期待。

参考文章

单链表为什么要设置头结点 https://www.cnblogs.com/youxin/p/3279391.html

单向循环链表 https://www.cnblogs.com/ssyfj/p/9424850.html

「更多精彩内容请关注公众号geekymv,喜欢请分享给更多的朋友哦」

单向循环链表(Java版)相关教程

File

File java i/o 输入输出流 一:编码问题 1.gbk: 中文占2个字节,英文一个字节 2.utf-8: 中文占3个字节,英文一个字节 3.utf-16be: 中文占1个字节,英文一个字节 File类常用API 1.java.io.File用于表示文件(目录) file类用于表示文件(目录)的信息(名称、

JavaScript RegExp对象(正则表达式)总结

JavaScript RegExp对象(正则表达式)总结 什么是正则表达式? 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个字符串规则,用来匹配符合规则的字符串。常在注册界面以及个人信息填写时会用到。 RegExp

Java.lang.ClassNotFoundException: com.google.common.reflect.

Java.lang.ClassNotFoundException: com.google.common.reflect.TypeToken 导致错误的原因是因为使用@FeignClient注解的前提需要增加依赖 引入 dependency groupIdcom.google.guava/groupId artifactIdguava/artifactId version18.0/version/dependency 紧接

新人求助:NoSuchMethodError……nullableSingleResult(java.uti

新人求助:NoSuchMethodError……nullableSingleResult(java.util.Collection) 报错信息: java.lang.NoSuchMethodError: 'java.lang.Object org.springframework.dao.support.DataAccessUtils.nullableSingleResult(java.util.Collection)' 过程: 整合JDBCT

java图书商城网上书店ssm框架

java图书商城网上书店ssm框架 网上书店网站的建立可以更好的解决这方面的问题,我们向广大用户推出的是一种全新的网上信息服务,旨在书店与消费者之间架起了一座高速、便捷的网上信息桥梁,我们的目的是节省您的时间、方便您的购书,使您永远走在时代的前沿

基于Java语言的面向对象基础算法的练习

基于Java语言的面向对象基础算法的练习 话不多说,直接上题目: 一、编写 Car 类,属性有品牌(brand)和颜色(color),show 方法打印 所有属性。 代码如下: public static void main(String[] args) { Car c = new Car(); c.brand = 法拉利; c.color = 酒

基础的类型使用及其含义(Java入坑)2

基础的类型使用及其含义(Java入坑)2 创建java文件BasicsType.java class BasicsType // 命名方式:一般都是一个或多个有含义的英文单词,每个单词的第一个字母大写。{public static void main(String[] args){// 我只能注释一行/*里面的内容都可以注释不管

[056]Java“哈希表”

[056]Java“哈希表” 1、哈希表 Hash Table:是一种“ 数组+链表 ”组合而成的数据结构,它同时具备数组和链表的优点 数组更利于元素的 查找 ; 链表更利于元素的 插入和删除 ; 在存储元素的时候,会用到“散列方法”,它的作用是将元素尽量 均衡地 分配到数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值