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

作者:我是小白呀 时间:2023-04-27 22:37:07 

概述

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

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

链表

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

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

链表包括三类:

  • 单向链表

  • 双向链表

  • 循环链表

环形链表

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

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

环形链表实现

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,环形链表,数据结构,算法
0
投稿

猜你喜欢

  • 基于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
  • 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
  • Android自定义评分控件的完整实例

    2021-10-26 19:25:58
  • SpringBoot中多环境配置和@Profile注解示例详解

    2023-11-29 05:39:04
  • Android开发之Button事件实现与监听方法总结

    2022-02-05 02:45:40
  • flutter BottomAppBar实现不规则底部导航栏

    2023-06-19 23:40:19
  • 深入多线程之:双向信号与竞赛的用法分析

    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
  • 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
  • asp之家 软件编程 m.aspxhome.com