Java 数据结构与算法系列精讲之环形链表
作者:我是小白呀 发布时间:2023-04-27 22:37:07
标签:Java,环形链表,数据结构,算法
概述
从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.
链表
链表 (Linked List) 是一种递归的动态数据结构. 链表以线性表的形式, 在每一个节点存放下一个节点的指针. 链表解决了数组需要先知道数据大小的缺点, 增加了节点的指针域, 空间开销较大.
链表包括三类:
单向链表
双向链表
循环链表
环形链表
环形链表 (Circular Linked List) 将单链表最后一个节点指向头节点, 即为环形链表. 如图:
环形链表实现
Node 类
// Node类
private class Node<E> {
public E e; // 元素
private Node next; // 下一个节点
// 构造
public Node(E e) {
this.e = e;
this.next = null;
}
@Override
public String toString() {
return e.toString();
}
}
insert 方法
// 插入数据
public void insert(E e) {
// 创建节点
Node node = new Node(e);
if (size == 0) {
head = node;
head.next = head;
tail = head;
} else {
tail.next = node;
node.next = tail;
tail = node;
}
size ++;
}
remove 方法
// 删除元素
public void remove(int index) {
// 检查索引是否越界
if (index < 0 || index > size) {
throw new RuntimeException("Invalid Index");
}
// 获取index前一个节点
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
// 删除数据
Node retNode = prev.next;
prev.next = retNode.next;
size --;
}
main
// main
public static void main(String[] args) {
// 创建循环链表
CircularLinkedList<Integer> circularLinkedList = new CircularLinkedList<>();
// 插入
for (int i = 0; i < 5; i++) {
circularLinkedList.insert(i);
System.out.println(circularLinkedList);
}
// 删除
for (int i = 0; i < 2; i++) {
circularLinkedList.remove(0);
System.out.println(circularLinkedList);
}
}
输出结果:
0
0->1
0->1->2
0->1->2->3
0->1->2->3->4
0->2->3->4
0->3->4
完整代码
public class CircularLinkedList<E> {
// Node类
private class Node<E> {
public E e; // 元素
private Node next; // 下一个节点
// 构造
public Node(E e) {
this.e = e;
this.next = null;
}
@Override
public String toString() {
return e.toString();
}
}
// 头节点和尾节点
private Node head = null;
private Node tail = null;
private int size; // 链表大小
// 构造函数
public CircularLinkedList() {
head = new Node(null);
size = 0;
}
// 插入数据
public void insert(E e) {
// 创建节点
Node node = new Node(e);
if (size == 0) {
head = node;
head.next = head;
tail = head;
} else {
tail.next = node;
node.next = tail;
tail = node;
}
size ++;
}
// 删除元素
public void remove(int index) {
// 检查索引是否越界
if (index < 0 || index > size) {
throw new RuntimeException("Invalid Index");
}
// 获取index前一个节点
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
// 删除数据
Node retNode = prev.next;
prev.next = retNode.next;
size --;
}
// 链表是否为空
public boolean isEmpty() {
return size == 0;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Node cur = head;
while (cur != tail) {
builder.append(cur + "->");
cur = cur.next;
}
builder.append(cur);
return builder.toString();
}
// main
public static void main(String[] args) {
// 创建循环链表
CircularLinkedList<Integer> circularLinkedList = new CircularLinkedList<>();
// 插入
for (int i = 0; i < 5; i++) {
circularLinkedList.insert(i);
System.out.println(circularLinkedList);
}
// 删除
for (int i = 0; i < 2; i++) {
circularLinkedList.remove(0);
System.out.println(circularLinkedList);
}
}
}
来源:https://iamarookie.blog.csdn.net/article/details/121904108


猜你喜欢
- 前言大家都知道在Java中,除了8种基本数据类型外,其他的都是引用类型。使用引用类型是为了更好地贯彻面向对象的思想,那为什么还要保留8种基本
- 跨域问题,其实百度上面有一堆的解决方案针对普通的情况其实百度上面的方案都是可行的。我这里主要介绍2种情况。当然我这里的配置都是基于网关的,而
- android中常常要用到ListView,有时也要用到ExpandableListView,如在手机设置中,对于分类有很好的效果,会用Li
- 用 Environment 类: &
- 分享一个小技巧:在日常开发中有时候需要切换到另外的一个分支,但在某些条件下当前的分支上存在一些文件尚未提交,这时候就需要使用到idea自带的
- 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种:源代码 -> 编译器优化的重排 -> 指令并
- 本文实例讲述了Android 开发使用PopupWindow实现加载等待界面功能。分享给大家供大家参考,具体如下:实现加载等待界面我用了两种
- 本文实例为大家分享了android实现注册页面开发的具体代码,供大家参考,具体内容如下在values文件里创建以下几个文件colors代码:
- 参考:How to catch an Exception from a threadIs there a way to make Runna
- JSONObject的使用 一、 JSON对象的使用:String content = "{'username&
- 在上篇文章给大家介绍了Android开发之开发者头条(一)启动页实现,感兴趣的朋友可以参考下。title: 带你实现开发者头条(二) 实现左
- ListView在实际实用中,一般都会有下新刷新和上拉加载的动态效果,今天要学的就是如何自定义带下拉刷新的ListView。原理解析:一般将
- 持久化类Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表。一个映射文件Hibernate的帮助确定如何从拉动类的值
- 一、背景说明由于以前在项目中一直使用sqlmap.xml进行mybatis语句的编写和实现,其xml实现动态更新和查询较为方便,而目前由于技
- RMI 介绍RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中
- 一、final概述子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适
- mybatisplus支持多种主键生成策略,默认采用认 ID_WORKER 即雪花算法雪花算法snowflflake是Twitter开源的分
- 本文实例讲述了Android编程使用Fragment界面向下跳转并一级级返回的实现方法。分享给大家供大家参考,具体如下:1.首先贴上项目结构
- 最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下欢迎交流和加入新的内容用到了JSwing,下面是一些具体的思路实现&
- 给Word文档设置背景时,通常只能针对整篇文档设置统一的背景,如果需要对某些页面单独设置背景,则需要通过另外的方式来实现。本文通过C# 程序