Java实现单链表基础操作

yizhihongxing

下面我来详细讲解“Java实现单链表基础操作”的完整攻略。

单链表简介

单链表是一种最简单的链式存储结构,其基本组成部分是结点,结点包括数据域和指针域,指针域用来指向下一个结点。单链表的优点是插入、删除数据方便,缺点是查询数据相对困难。

基础操作

单链表的基础操作包括创建链表、插入结点、删除结点、查询结点、遍历链表等。下面分别进行介绍。

创建链表

创建链表需要先定义结点类,再利用结点类创建链表。结点类中包含了数据域和指针域,代码如下:

public class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

定义好结点类之后,在创建链表的过程中,只需要依次插入结点即可。例如,我们要创建一个包含 5 个元素的链表,代码如下:

ListNode head = new ListNode(0); // 创建链表头结点
ListNode p = head; // 定义指针指向头结点

for (int i = 1; i < 5; i++) { // 循环创建 4 个结点
    ListNode node = new ListNode(i); // 创建结点
    p.next = node; // 将结点插入链表
    p = node; // 指针指向新插入的结点
}

插入结点

在链表中插入结点,是先找到要插入位置的前一个结点,再将新结点插入该位置。例如,我们要在链表中间插入一个结点,代码如下:

ListNode node = new ListNode(val); // 创建新结点
ListNode p = head; // 定义指针指向头结点

while (p.next != null && p.next.val < val) { // 寻找要插入位置的前一个结点
    p = p.next;
}

node.next = p.next; // 将新结点插入到链表中
p.next = node;

删除结点

在链表中删除结点,需要先找到要删除的结点的前一个结点,然后将其指针指向该结点的下一个结点。例如,我们要删除链表中值为 3 的结点,代码如下:

ListNode p = head; // 定义指针指向头结点

while (p.next != null && p.next.val != val) { // 寻找要删除结点的前一个结点
    p = p.next;
}

if (p.next != null && p.next.val == val) { // 删除结点
    p.next = p.next.next;
}

查询结点

在链表中查询结点,需要遍历整个链表,找到目标结点。例如,我们要查询链表中值为 2 的结点是否存在,代码如下:

ListNode p = head; // 定义指针指向头结点

while (p != null) {
    if (p.val == val) { // 找到目标结点
        return true;
    }
    p = p.next;
}

return false;

遍历链表

遍历链表就是将链表中的每个结点都访问一遍,可以输出结点中的值或者进行其他操作。例如,我们要输出链表中每个结点的值,代码如下:

ListNode p = head.next; // 定义指针指向第一个结点

while (p != null) {
    System.out.print(p.val + " "); // 输出结点中的值
    p = p.next;
}

示例

下面给出两个示例,分别是创建链表和删除结点的示例。

创建链表示例

假设我们要创建一个链表,包含以下 5 个元素: 1 -> 3 -> 5 -> 7 -> 9。下面是完整代码:

public class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class Solution {
    public ListNode createLinkedList() {
        ListNode head = new ListNode(0); // 创建链表头结点
        ListNode p = head; // 定义指针指向头结点

        for (int i = 1; i < 10; i += 2) { // 循环创建 5 个结点
            ListNode node = new ListNode(i); // 创建结点
            p.next = node; // 将结点插入链表
            p = node; // 指针指向新插入的结点
        }

        return head.next;
    }
}

删除结点示例

假设现在有一个链表,包含以下 5 个元素: 1 -> 3 -> 5 -> 7 -> 9。我们要删除其中值为 5 的结点。下面是完整代码:

public class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class Solution {
    public void deleteNode(ListNode head, int val) {
        ListNode p = head;

        while (p.next != null && p.next.val != val) { // 寻找要删除结点的前一个结点
            p = p.next;
        }

        if (p.next != null && p.next.val == val) { // 删除结点
            p.next = p.next.next;
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现单链表基础操作 - Python技术站

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

相关文章

  • vue中封装echarts公共组件过程

    下面是基于Vue2.x版本的封装echarts公共组件的完整攻略。 1. 准备工作 首先,我们需要引入echarts的依赖,这可以通过npm或CDN两种方式实现。 npm方式 在项目的根目录打开终端,输入以下命令安装echarts npm install -S echarts CDN方式 在根目录的index.html中引入echarts的js和css文件 …

    other 2023年6月25日
    00
  • 详解js中let与var声明变量的区别

    详解js中let与var声明变量的区别 在JavaScript中,我们可以使用let和var关键字来声明变量。尽管它们都可以用于声明变量,但它们在作用域和变量提升方面有一些重要的区别。 作用域 var声明的变量具有函数作用域,而let声明的变量具有块级作用域。 函数作用域意味着var声明的变量在整个函数内部都是可见的,而块级作用域意味着let声明的变量只在声…

    other 2023年8月20日
    00
  • 分组字符合并SQL语句 按某字段合并字符串之一(简单合并)

    分组字符合并SQL语句是一种将同一字段的多行记录中的某一列合并为单行的方法。它常常被用于将多行记录中的文本信息合并为单一的文本信息。 以下是分组字符合并SQL语句 按某字段合并字符串之一(简单合并)的完整攻略: SELECT 字段1, GROUP_CONCAT(字段2) AS 新列名1 FROM 表名 GROUP BY 字段1; 其中,“字段1”是要进行分组…

    other 2023年6月26日
    00
  • Swift教程之字符串和字符详解

    Swift教程之字符串和字符详解 字符串基础 字符串在 Swift 中是一种基本类型,表示有序的字符集合。可以通过字符串字面量创建字符串,例如: let greeting = "Hello, world!" Swift 中的字符串是采用 Unicode 编码的,可以包含任意字符,即使是如下的 Unicode 标量: let ?? = &q…

    other 2023年6月20日
    00
  • Rust之Substrate框架中的pallet详解

    Rust之Substrate框架中的pallet详解 Substrate是一个用于构建区块链应用的开发框架,而pallet是Substrate中的一个重要概念。本攻略将详细讲解Substrate框架中的pallet,并提供两个示例说明。 什么是pallet? 在Substrate中,pallet是一种可插拔的模块,用于实现区块链的核心逻辑。每个pallet都…

    other 2023年7月27日
    00
  • navicat创建oracle数据库

    Navicat创建Oracle数据库攻略 Navicat是一款功能强大的数据库管理工具,支持多种数据库,包括Oracle数据库。本攻略将介绍如何使用Navicat创建Oracle数据库,并提供两个示例说明。 步骤一:连接Oracle数据库 在Navicat中连接Oracle数据库,需要提供以下信息: 主机名或IP地址 端口号 服务名或SID 用户名和密码 以…

    other 2023年5月9日
    00
  • Win10版Xbox应用程序更新 提高稳定性和流畅性

    Win10版Xbox应用程序更新攻略 最近微软对Win10版Xbox应用程序进行了更新,用于提高其稳定性和流畅性。以下是该应用程序更新的完整攻略。 步骤1:打开Microsoft Store应用程序 首先,打开Microsoft Store应用程序。可以在Win10的开始菜单中找到该应用程序。 步骤2:搜索Xbox应用程序 在Microsoft Store应…

    other 2023年6月25日
    00
  • iOS获取设备唯一标识的实现步骤

    获取iOS设备唯一标识,一般有两种方式,分别是使用UDID和使用UUID。由于苹果公司已经禁用了获取UDID的方式,所以我们主要介绍如何使用UUID获取设备唯一标识。下面是具体步骤: 1. 导入头文件 在需要获取设备唯一标识的地方导入以下头文件: #import <UIKit/UIKit.h> #import "KeychainWrap…

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