Java 单链表数据结构的增删改查教程

Java 单链表数据结构的增删改查教程

什么是单链表

单链表是一种常用的线性表,是链式存储结构,由多个结点组成,每个结点包含数据域和指针域,指针域指向下一个结点。单链表的优势在于可以在任意位置进行元素的插入和删除操作,但是在查询某个元素时,需要从头结点依次遍历,效率较低。

节点

单链表中的每一个元素称为节点,使用Java类进行表示

class Node {
    int val;  // 节点存储的元素值
    Node next; // 指向下一个节点的指针

    public Node(int val) {
        this.val = val;
    }
}

创建链表

创建一个单链表需要一个头结点,头结点不存储任何元素值,只是为了方便操作。

class LinkedList {
    Node head; // 头结点

    public LinkedList() {
        this.head = new Node(0); // 初始化头结点
    }
}

插入节点

在单链表中插入一个元素需要知道要插入的位置和元素的值。插入操作的指针操作很重要,因为没有指针指向前一个节点,所以需要将待插入节点的指针指向下一个节点。

public void add(int val) {
    Node node = new Node(val);
    Node cur = head;
    while (cur.next != null) {
        cur = cur.next;
    }
    cur.next = node;
}

将一个节点插入某个位置时,需要先找到要插入位置的前一个节点,然后将它的指针指向新节点,新节点的指针指向后一个节点。

public void add(int index, int val) {
    Node node = new Node(val);
    Node cur = head;
    for (int i = 0; i < index; i++) {
        cur = cur.next;
    }
    node.next = cur.next;
    cur.next = node;
}

示例:

LinkedList list = new LinkedList();
list.add(1);
list.add(3);
list.add(2);
list.add(4);
list.add(0, 5); // 在第一个位置插入元素5

删除节点

删除单链表中的一个元素需要知道要删除元素的位置,需要将该节点的前一个节点的指针指向该节点的后一个节点。

public void remove(int index) {
    Node cur = head;
    for (int i = 0; i < index; i++) {
        cur = cur.next;
    }
    cur.next = cur.next.next;
}

示例:

LinkedList list = new LinkedList();
list.add(1);
list.add(3);
list.add(2);
list.add(4);
list.remove(2); // 删除第三个元素

查询节点

查询单链表中的一个元素需要从头结点开始遍历,直到找到要查询的元素。如果单链表非常长,效率就会非常低。

public Node search(int val) {
    Node cur = head;
    while (cur.next != null) {
        cur = cur.next;
        if (cur.val == val) {
            return cur;
        }
    }
    return null;
}

示例:

LinkedList list = new LinkedList();
list.add(1);
list.add(3);
list.add(2);
list.add(4);
Node node = list.search(3); // 查询元素3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 单链表数据结构的增删改查教程 - Python技术站

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

相关文章

  • Android编程之基于Log演示一个activity生命周期实例详解

    让我来向你详细讲解一下“Android编程之基于Log演示一个activity生命周期实例详解”的完整攻略。 什么是Android中的生命周期? 在Android应用程序中,Activity生命周期指的是从Activity的创建(或从新创建)到销毁的整个过程。整个过程包括了Activity的启动、暂停、停止甚至是销毁等一系列的生命周期事件。在每个生命周期事件…

    other 2023年6月27日
    00
  • yum安装指定版本的软件包的方法

    yum安装指定版本的软件包的方法 在使用Linux系统时,我们通常会借助软件包管理工具,如yum来进行软件包的安装、升级等操作。然而,有时候我们希望安装或降级软件包的指定版本,而不是最新的版本。本文将介绍yum安装指定版本的软件包的方法。 1. 查看可用版本 首先,我们需要查看当前可用的软件包版本。可以通过以下命令来查看: yum –showduplica…

    其他 2023年3月29日
    00
  • windows系统下文件名太长无法删除该怎么办?

    Windows系统下文件名太长无法删除的问题通常是由于文件名过长或文件路径过长引起的,这时可以采用以下几种方法解决: 方法一:使用“长路径删除工具” “长路径删除工具”是一款免费的软件,其可以帮助用户快速删除长文件名或长路径文件。步骤: 打开“长路径删除工具”软件。 拖拽或输入要删除的文件路径或文件夹路径。 点击“删除文件”按钮。 等待删除完成。 示例: 首…

    other 2023年6月26日
    00
  • Java 判断IP地址的合法性实例详解

    Java 判断IP地址的合法性实例详解 在Java中,我们可以使用正则表达式来判断一个IP地址的合法性。下面是一个完整的攻略,包含了两个示例说明。 步骤一:编写正则表达式 首先,我们需要编写一个正则表达式来匹配合法的IP地址。一个合法的IP地址由四个数字组成,每个数字的取值范围是0到255,数字之间用点号(.)分隔。下面是一个示例的正则表达式: String…

    other 2023年7月31日
    00
  • nohup运行命令和停止进程命令

    在Linux系统中,我们可以使用nohup命令来在后台运行命令,即使终端关闭或断开连接,命令也会继续运行。本攻略将详细介绍nohup命令的使用方法和示例以及如何止后台进程。 nohup命令的使用方法 nohup命令基本语法如下: nohup command [arg…] 其中,command是要运行的命令,arg是令的参数。nohup命令会将comman…

    other 2023年5月9日
    00
  • 逆波兰计算器(Java实现)

    逆波兰计算器(Java实现)攻略 逆波兰计算器是一种用于进行数学表达式计算的算法,它使用后缀表达式(逆波兰表达式)来表示数学表达式。在逆波兰表达式中,操作符位于操作数之后,这样可以避免使用括号来表示优先级。下面是一个详细的逆波兰计算器的Java实现攻略。 步骤1:定义逆波兰计算器类 首先,我们需要定义一个逆波兰计算器类,用于执行逆波兰表达式的计算。以下是一个…

    other 2023年8月5日
    00
  • Sybase:循环调用存储过程

    Sybase:循环调用存储过程 Sybase数据库中,我们经常需要使用存储过程来实现复杂的业务逻辑。而在某些场景下,我们可能需要对一个存储过程进行循环调用,以便在不同的参数下执行相同的业务逻辑。本文将介绍如何在Sybase数据库中循环调用存储过程。 准备工作 在进行循环调用存储过程之前,我们需要创建一个需要循环调用的存储过程。以下是一个简单的示例存储过程: …

    其他 2023年3月28日
    00
  • C++类的特种函数生成机制详解

    C++类的特种函数生成机制详解 什么是特种函数? C++中存在一些与类相关的函数,它们被称为特种函数。这些特种函数包括:构造函数、析构函数、拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数。这些特殊函数被特别定义,用于实现类的构造、销毁、拷贝和移动操作。 特种函数的生成机制 1. 构造函数 构造函数用于类的实例化过程。类中如果没有定义构造函数,则会生成…

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