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日

相关文章

  • javascriptdom编程艺术

    JavaScript DOM编程艺术是一本介绍如何使用JavaScript操作HTML和CSS的经典书籍。以下是使用JavaScript DOM编程艺术的完整攻略: 首先,创建一个HTML文档,并在其中添加一些元素。例如,可以创建一个包含一个按钮和一个文本框的HTML文档: “`html JavaScript DOM Programming Submit …

    other 2023年5月9日
    00
  • Qt实现电子时钟的示例代码

    这里是Qt实现电子时钟的示例代码的完整攻略。我会详细介绍这个过程,以便初学者也能理解。 环境准备 在开始编写代码之前,您需要确保您的电脑上安装了Qt Creator和Qt库。下面是安装的步骤: 下载Qt Creator,从Qt官方网站 – https://www.qt.io/download。 在安装程序上选择你的操作系统,下载安装程序后进行运行。 安装程序…

    other 2023年6月26日
    00
  • markdown数学符号数学表达式,绝对有你想要的

    Markdown数学符号数学表达式攻略 Markdown是一种轻量级标记语言,它支持使用数学符号和数学表达式。本攻略将详细介绍如何在Markdown中使用数学符号和数学表达式,并提供两个示例。 数学符号 Markdown支持使用LaTeX语法来插入数学符号。以下是一些常用的数学符号及其LaTeX语法: 加号:$+$ 减号:$-$ 乘号:$\times$ 除号…

    other 2023年5月9日
    00
  • 三种方法解决IE已经阻止此站点以不安全的方式使用ActiveX控件

    当使用ActiveX控件时,Internet Explorer(IE)会对该控件进行安全性检查。如果IE认为控件没有经过验证或者没有签名,它就会阻止控件的加载,同时提示“IE已经阻止此站点以不安全的方式使用ActiveX控件”或类似的警告提示。这里列出三种解决该问题的方法: 方法一:关闭IE的安全设置 打开Internet Explorer浏览器,点击菜单栏…

    other 2023年6月27日
    00
  • nginx相关

    Nginx相关的完整攻略 Nginx是一款高性能的Web服务器和反向代理服务器,具有占用资源少、稳定性高、扩展性强等优点。本文将为您提供一份Nginx相关的完整攻略,包括安装、配置和两个示例说明。 安装Nginx 在Ubuntu系统中,可以使用以下命令安装Nginx: sudo apt-get update sudo apt-get install ngin…

    other 2023年5月5日
    00
  • Python二进制数据结构Struct的具体使用

    Python二进制数据结构Struct的具体使用 什么是Struct Struct是Python标准库中提供的一个二进制数据结构处理模块,可以使用它来实现二进制流数据的打包与解包。通过Struct,我们可以快速且方便地处理各种二进制数据格式,例如进行网络传输的数据包、读写二进制文件等。在Python中使用Struct可以显著提高二进制数据处理的效率。 Str…

    other 2023年6月27日
    00
  • UML中类图的四种关系及其代码实现

    UML中类图的四种关系及其代码实现 UML(统一建模语言)是用于软件系统建模的一种标准化语言,主要包括用于可视化软件系统的各种图表、图形符号、约束等。其中类图是一种用于表示系统中对象以及它们之间关系的图形化编程工具。类图用于描述类之间的关系,包括聚合、泛化、关联和组合四种关系。本文将详细介绍每种关系以及其对应的代码实现。 1. 聚合关系 聚合关系是指一种弱的…

    其他 2023年3月28日
    00
  • u盘建议买多大内存 u盘什么牌子好

    U盘建议买多大内存 选择U盘的内存大小需要根据个人需求和使用场景来决定。以下是一些常见的内存大小建议: 8GB – 16GB:适合存储小型文件,如文档、图片和音乐。如果你只需要传输一些简单的文件,这个内存大小足够了。 32GB – 64GB:适合存储中等大小的文件,如高清视频和大型软件。如果你需要传输一些大型文件或者需要在U盘上存储一些常用的软件,这个内存大…

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