Java 数据结构与算法系列精讲之环形链表

网友投稿 289 2022-08-27


Java 数据结构与算法系列精讲之环形链表

目录概述链表环形链表环形链表实现Node类insert方法remove方法main完整代码

概述

从今天开始, 小白我将带大家开启 java 数据结构 & 算法的新篇章.

链表

链表 (Linked List) 是一种递归的动态数据结构. 链表以线性表的形式, 在每一个节点存放下一个节点的指针. 链表解决了数组需要先知道数据大小的缺点, 增加了节点的指针域, 空间开销较大.

链表包括三类:

单向链表

双向链表

循环链表

环形链表

环形链表 (Circular Linked List) 将单链表最后一个节点指向头节点, 即为环形链表. 如图:

环形链表实现

Node 类

// Node类

private class Node {

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 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 clhHBfiThEkass CircularLinkedList {

// Node类

private chttp://lass Node {

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 http://== 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 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);

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Python】面向对象-类的成员,方法(Python是面向对象吗)
下一篇:【Python】主动调用其他类的方法(python类方法调用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~