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

yizhihongxing

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日

相关文章

  • Office2016中excel/ppt右键菜单闪退该怎么办?

    针对“Office2016中excel/ppt右键菜单闪退该怎么办?”的问题,以下是解决该问题的完整攻略: 1. 清除Office缓存文件 第一种方法是清除Office缓存文件,这对于修复大多数Office问题都有效。 执行以下步骤: 关闭所有Office程序,包括Excel、PPT等程序。 打开“文件资源管理器”并输入以下路径:%localappdata%…

    other 2023年6月27日
    00
  • 中兴AXON天机7有哪四个版本 中兴AXON天机7各版本区别介绍

    中兴AXON天机7版本介绍攻略 中兴AXON天机7是一款备受关注的智能手机,共有四个版本。下面将详细介绍每个版本的区别。 1. 中兴AXON天机7标准版 处理器:搭载高性能的骁龙865处理器,提供出色的性能和流畅的操作体验。 内存和存储:配备8GB RAM和128GB内部存储空间,可满足大部分用户的需求。 摄像系统:后置主摄像头为6400万像素,支持光学防抖…

    other 2023年8月1日
    00
  • 把文件名当中含有特殊字符[.\]的文件删除的方法

    删除文件名包含特殊字符[.]的文件,可以通过以下方法进行: 使用Linux命令行工具进行删除 步骤如下: (1)打开终端,进入待处理文件所在目录 (2)运行以下命令,使用find查找包含指定字符的文件,并使用rm命令进行删除: find . -type f -name ‘*[.\]*’ -exec rm {} \; 其中,“.”表示当前目录,“-type f…

    other 2023年6月26日
    00
  • Java实现双端链表LinkedList

    Java实现双端链表LinkedList的完整攻略 双端链表LinkedList介绍 双端链表LinkedList是链表的一种,除了拥有节点指向下一个节点的指针外,还拥有指向上一个节点的指针,这样可以双向遍历链表。常用的操作包括插入、删除、获取和遍历。 实现步骤 1. 定义节点类 节点类用来表示链表的一个节点,包含节点的值(value)、下一个节点(next…

    other 2023年6月27日
    00
  • C++11中的default函数使用

    C++11中的default函数是一种特殊用途的函数,用于显式地声明一个构造函数或析构函数是使用编译器自动生成的。在C++11之前,如果想保留编译器自动生成的构造函数或析构函数,就必须手动将其定义为empty函数体,而C++11的default函数使得这个流程变得更加简单和方便。 1. default构造函数 在C++中,如果一个类没有定义构造函数,编译器会…

    other 2023年6月26日
    00
  • win10预览版9880下载地址 win10 9880官方镜像下载

    Win10预览版9880下载攻略 Win10预览版9880是Windows 10操作系统的一个早期版本,本攻略将详细介绍如何下载该版本的镜像文件。请按照以下步骤进行操作: 步骤一:访问官方网站 首先,你需要访问Windows官方网站以获取Win10预览版9880的下载地址。在浏览器中输入以下网址并按下回车键: [https://www.microsoft.c…

    other 2023年8月4日
    00
  • PS如何自定义画笔?PS定义画笔预设方法介绍

    PS是一款功能强大的图形处理软件,不仅拥有各种常规的画笔工具,还可以自定义画笔。下面是自定义画笔的详细攻略: 一、自定义画笔方法 1. 打开画笔编辑器 在PS软件中打开画笔编辑器,方法是在工具栏中找到画笔工具,右键单击选择“画笔预设”,在下拉菜单中选择“画笔编辑器”。 2. 新建一个画笔 在画笔编辑器界面中,点击下方的“新建画笔”按钮。然后选择基础画笔,可以…

    other 2023年6月25日
    00
  • 360虚拟系统如何安装软件应用? 360虚拟系统安装软件应用方法

    可以用以下步骤来安装软件应用到360虚拟系统中: 步骤1: 打开360虚拟系统并登录 首先,在电脑上打开360虚拟系统。登录后,您将进入360虚拟系统的桌面界面。 步骤2: 打开应用商店 在360虚拟系统的桌面界面上,您会看到一个名为“应用商店”的图标。单击它以打开应用商店页面。 步骤3: 在应用商店查询应用 在应用商店页面,您可以搜索或浏览所需的应用程序。…

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