Java 数据结构与算法系列精讲之环形链表
作者:我是小白呀 时间:2023-04-27 22:37:07
概述
从今天开始, 小白我将带大家开启 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,环形链表,数据结构,算法
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于springboot的RestTemplate、okhttp和HttpClient对比分析
2021-07-02 03:14:21
Android 文件存储与SharedPreferences存储方式详解用法
2021-07-22 20:11:54
Unity中EventTrigger的几种使用操作
2022-01-15 06:54:37
![](https://img.aspxhome.com/file/2023/6/88426_0s.jpg)
Java使用Thread和Runnable的线程实现方法比较
2021-11-17 07:52:54
搭建简单的Spring-Data JPA项目
2023-04-05 01:06:30
SpringBoot在项目中访问静态资源步骤分析
2022-12-13 08:04:31
![](https://img.aspxhome.com/file/2023/2/110932_0s.png)
Android自定义评分控件的完整实例
2021-10-26 19:25:58
![](https://img.aspxhome.com/file/2023/4/139324_0s.gif)
SpringBoot中多环境配置和@Profile注解示例详解
2023-11-29 05:39:04
Android开发之Button事件实现与监听方法总结
2022-02-05 02:45:40
flutter BottomAppBar实现不规则底部导航栏
2023-06-19 23:40:19
![](https://img.aspxhome.com/file/2023/6/130446_0s.gif)
深入多线程之:双向信号与竞赛的用法分析
2022-02-17 06:54:49
Java并发编程系列之LockSupport的用法
2022-04-07 06:48:58
java使用Filter实现自动登录的方法
2022-09-09 15:46:47
IDEA 2021.1 的 Win 和 Mac 快捷键大全
2023-02-27 13:01:28
Android编程之短信窃听器实现方法
2023-11-01 00:48:22
Netty分布式pipeline管道传播outBound事件源码解析
2022-10-17 23:43:06
![](https://img.aspxhome.com/file/2023/2/87342_0s.png)
Eclipse中改变默认的workspace的方法及说明详解
2022-07-31 12:07:21
解决dubbo错误ip及ip乱入问题的方法
2023-08-06 17:18:02
java中functional interface的分类和使用详解
2021-09-15 15:59:20
Android 使用 Scroller 实现平滑滚动功能的示例代码
2022-01-20 22:49:35
![](https://img.aspxhome.com/file/2023/6/88666_0s.gif)