Java实现单链表SingleLinkedList增删改查及反转 逆序等

Java实现单链表SingleLinkedList增删改查及反转 逆序等

简介

单链表是数据结构中常见的一种,它是由一系列节点(Node)构成的链式结构,每个节点包含两部分:数据部分和指针部分,数据部分用于存储节点的数据,指针部分用于指向下一个节点。单链表的头节点指向第一个有效节点,最后一个节点的指针指向NULL。

SingleLinkedList类

我们首先需要定义一个SingleLinkedList类,用于描述单链表结构。

public class SingleLinkedList<T> {
    // 头结点
    private Node<T> head;

    // 结点数
    private int size;

    // 节点定义
    private static class Node<T> {
        T data;
        Node<T> next;
        Node(T data) {
            this.data = data;
            this.next = null;
        }
    }

    //构造方法
    public SingleLinkedList() {
        this.head = null;
        this.size = 0;
    }

    //添加节点
    public void add(T data) {
        Node<T> node = new Node<>(data);
        if (head == null) {
            head = node;
        } else {
            Node<T> cur = head;
            while (cur.next != null) {
                cur = cur.next;
            }
            cur.next = node;
        }
        size++;
    }

    //删除节点
    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        if (index == 0) {
            head = head.next;
        } else {
            Node<T> prev = get(index - 1);
            prev.next = prev.next.next;
        }
        size--;
    }

    //修改节点数据
    public void set(int index, T data) {
        Node<T> node = get(index);
        node.data = data;
    }

    //获取节点数据
    public T get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        Node<T> cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur.data;
    }

    //获取链表长度
    public int size() {
        return size;
    }

    //反转链表
    public void reverse() {
        Node<T> prev = null;
        Node<T> cur = head;
        while (cur != null) {
            Node<T> next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        head = prev;
    }
}

测试

我们可以通过简单的测试来验证单链表的相关操作是否正确。

public class SingleLinkedListTest {
    public static void main(String[] args) {
        SingleLinkedList<Integer> list = new SingleLinkedList<>();
        //添加数据
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        //获取数据
        System.out.println(list.get(0)); //输出1
        System.out.println(list.get(1)); //输出2
        System.out.println(list.get(2)); //输出3
        System.out.println(list.get(3)); //输出4
        //修改数据
        list.set(0, 0);
        System.out.println(list.get(0)); //输出0
        //删除数据
        list.remove(2);
        System.out.println(list.get(2)); //输出4
        //反转链表
        list.reverse();
        System.out.println(list.get(0)); //输出4
        System.out.println(list.get(1)); //输出3
        System.out.println(list.get(2)); //输出2
        System.out.println(list.get(3)); //输出0
    }
}

示例说明

假设有如下单链表:

1 -> 2 -> 3 -> 4 -> 5

我们需要删除第3个节点,修改第5个节点的数据,然后反转链表。

SingleLinkedList<Integer> list = new SingleLinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);

// 删除第3个节点
list.remove(2);

// 修改第5个节点的数据
list.set(3, 6);

// 反转链表
list.reverse();

System.out.println(list.get(0));  // 输出5
System.out.println(list.get(1));  // 输出4
System.out.println(list.get(2));  // 输出6
System.out.println(list.get(3));  // 输出2

另外,假设有如下单链表:

A -> B -> C -> D

我们需要在第2个节点后插入一个节点E。

SingleLinkedList<String> list = new SingleLinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");

Node<String> node = new Node<>("E");
node.next = list.get(2).next;
list.get(2).next = node;

System.out.println(list.get(1));  // 输出B
System.out.println(list.get(2));  // 输出E
System.out.println(list.get(3));  // 输出C

以上就是单链表的常见操作及其实现方式,通过这些例子我们可以更加清晰地了解单链表的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现单链表SingleLinkedList增删改查及反转 逆序等 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java TCP协议通信超详细讲解

    Java TCP协议通信超详细讲解 什么是TCP协议 TCP(Transmission Control Protocol)传输控制协议是一种可靠的、面向连接的传输层协议。TCP协议通过序列号、确认、重传等方式,确保传输的可靠性,但会对网络带宽进行占用,因此适用于对网络传输质量要求高的场景。 TCP协议通信的基本流程 TCP协议通信的基本流程如下: 服务器启动…

    other 2023年6月27日
    00
  • Windows Powershell 执行文件和脚本

    下面我将为您详细讲解“Windows Powershell 执行文件和脚本”的完整攻略。 执行 PowerShell 文件 首先,您需要使用 PowerShell 命令执行 PowerShell 文件。在 PowerShell 中运行文件或脚本需要开启适当的执行策略。如果您未开启执行策略,将无法运行文件或脚本。 开启执行策略 要开启执行策略,请使用以下命令行…

    other 2023年6月27日
    00
  • HTML转PDF的纯客户端和纯服务端实现方案

    实现HTML转PDF有两种方案:纯客户端方案和纯服务端方案。 纯客户端方案 纯客户端方案是指在前端页面上使用JavaScript将HTML转换为PDF,实现方式主要有以下两种。 使用jsPDF库 jsPDF是一个流行的用于生成PDF的JavaScript库,它可以直接在浏览器中生成PDF文档。使用jsPDF库,需要先在HTML中引入以下两个文件: <s…

    other 2023年6月27日
    00
  • Win11重启快捷键是什么?Win11重启快捷键介绍

    下面我将为你详细讲解 Win11 重启快捷键及其介绍。 Win11 重启快捷键是什么? Win11 重启快捷键是一组按键,通过短时间内同时按下这些按键可以快速地重启电脑。具体的组合是:按下 Win键+Ctrl+Shift+B。 Win11 重启快捷键的介绍 Win11 重启快捷键的实际作用就是让操作系统重启。这个快捷键可以在一些特定场景下派上用场,比如当你的…

    other 2023年6月26日
    00
  • FreeRTOS进阶内存管理示例完全解析

    FreeRTOS进阶内存管理示例完全解析 本攻略将详细讲解FreeRTOS进阶内存管理示例的完整过程,包括两个示例说明。下面是每个示例的详细解析: 示例一:动态内存分配 在这个示例中,我们将使用FreeRTOS的动态内存分配功能来管理任务的内存。以下是示例的步骤: 首先,我们需要在FreeRTOS配置文件中启用动态内存分配功能。打开FreeRTOS配置文件(…

    other 2023年8月2日
    00
  • 让电脑急速如飞的七个小技巧(批处理)

    让电脑急速如飞的七个小技巧(批处理) 在这个攻略中,我将向您介绍七个使用批处理技巧来提高电脑速度的方法。批处理是一种在Windows操作系统中运行的脚本语言,可以自动执行一系列命令。以下是这七个小技巧的详细说明: 1. 清理临时文件 临时文件会占用硬盘空间并降低电脑性能。使用批处理可以自动清理这些文件。以下是一个示例批处理脚本: @echo off echo…

    other 2023年8月6日
    00
  • javafx的alert

    以下是“JavaFX的Alert的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: JavaFX的Alert的完整攻略 JavaFX的Alert是一种用于显示消息、警告和错误的对话框。Alert可以显示不同类型的消息,INFORMATION、WARNING、ERROR和CONFIRMATION等。以下是JavaFX的Alert的详…

    other 2023年5月10日
    00
  • Word2016内容控件怎么使用? Word日期内容控件的使用方法

    下面我给你详细讲解 Word2016 内容控件的使用方法。 什么是 Word2016 内容控件? Word2016 内容控件(Content Control)是 Word 文档中的一种特殊对象,它可以用来限制用户对文档内容的编辑,同时也可以帮助用户输入复杂的内容格式,包括日期、列表、下拉框、多行文本等内容。在 Word 内容控件中,你可以自定义显示样式、内容…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部