Java实现单链表的操作

yizhihongxing

Java实现单链表的操作攻略

单链表是一种常见的数据结构,它由节点构成,每个节点都包含了一个值和指向下一个节点的指针。本文将详细讲解如何在Java中实现单链表的操作。

节点类的定义

我们先定义一个节点类,包含了一个值和一个指向下一个节点的指针。在Java中可以使用类来实现节点:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

其中val表示节点存储的值,next表示指向下一个节点的指针。

链表的基本操作

插入节点

在单链表中,我们可以在表头或表尾插入节点,也可以在中间插入节点。下面是三种插入节点的方法。

在表头插入节点

在链表的表头插入节点,只需要将新节点的next指向原来的头结点,然后将新节点设置为新的头结点即可。

public ListNode insertAtHead(ListNode head, int val) {
    ListNode newHead = new ListNode(val);
    newHead.next = head;
    return newHead;
}

在表尾插入节点

在链表的表尾插入节点,需要找到链表的尾节点,然后将尾节点的next指向新节点。

public ListNode insertAtTail(ListNode head, int val) {
    ListNode newTail = new ListNode(val);
    if (head == null) { // 链表为空
        return newTail;
    }
    ListNode tail = head;
    while (tail.next != null) { // 找到尾节点
        tail = tail.next;
    }
    tail.next = newTail; // 将尾节点的next指向新节点
    return head;
}

在中间插入节点

在链表的中间插入节点,需要找到需要插入的位置,然后将新节点的next指向该位置的后继节点,然后将该位置的前驱节点的next指向新节点。

public ListNode insertAtIndex(ListNode head, int index, int val) {
    if (index < 0) { // 无效的插入位置
        return head;
    }
    if (index == 0) { // 插入位置为表头
        return insertAtHead(head, val);
    }
    ListNode newNode = new ListNode(val);
    ListNode prev = head;
    for (int i = 0; i < index - 1; i++) { // 找到插入位置的前驱节点
        if (prev == null) {
            return head;
        }
        prev = prev.next;
    }
    if (prev == null) { // 无效的插入位置
        return head;
    }
    newNode.next = prev.next; // 将新节点的next指向后继节点
    prev.next = newNode; // 将前驱节点的next指向新节点
    return head;
}

删除节点

在单链表中,我们可以删除表头节点、表尾节点,也可以删除中间的节点。下面是三种删除节点的方法。

删除表头节点

在链表的表头删除节点,只需要将头结点的next设置为新的头结点即可。

public ListNode deleteAtHead(ListNode head) {
    if (head == null) { // 链表为空
        return null;
    }
    return head.next;
}

删除表尾节点

在链表的表尾删除节点,需要找到链表的尾节点的前驱节点,然后将前驱节点的next指向null

public ListNode deleteAtTail(ListNode head) {
    if (head == null) { // 链表为空
        return null;
    }
    ListNode tail = head;
    ListNode prev = null;
    while (tail.next != null) { // 找到尾节点和前驱节点
        prev = tail;
        tail = tail.next;
    }
    if (prev == null) { // 链表只有一个节点
        return null;
    }
    prev.next = null; // 将前驱节点的next指向null
    return head;
}

删除中间节点

在链表的中间删除节点,需要找到需要删除的节点的前驱节点,然后将前驱节点的next指向需要删除的节点的后继节点。

public ListNode deleteAtIndex(ListNode head, int index) {
    if (index < 0) { // 无效的删除位置
        return head;
    }
    if (index == 0) { // 删除位置为表头
        return deleteAtHead(head);
    }
    ListNode prev = head;
    for (int i = 0; i < index - 1; i++) { // 找到删除位置的前驱节点
        if (prev == null || prev.next == null) {
            return head;
        }
        prev = prev.next;
    }
    if (prev == null || prev.next == null) { // 无效的删除位置
        return head;
    }
    prev.next = prev.next.next; // 将前驱节点的next指向后继节点
    return head;
}

遍历链表

遍历链表可以使用循环或递归的方式,下面是两种遍历链表的方法。

循环遍历链表

循环遍历链表,只需要从头结点开始,依次遍历每一个节点即可。

public void traverse(ListNode head) {
    ListNode curr = head;
    while (curr != null) {
        System.out.print(curr.val + " ");
        curr = curr.next;
    }
    System.out.println();
}

递归遍历链表

递归遍历链表,只需要遍历当前节点和当前节点的后继节点即可。

public void traverse(ListNode head) {
    if (head == null) {
        return;
    }
    System.out.print(head.val + " ");
    traverse(head.next);
}

示例说明

示例1:在链表中插入节点

下面是一个示例,向一个长度为3的链表中插入一个值为5的节点。

ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution();
head = solution.insertAtIndex(head, 1, 5);
solution.traverse(head); // 输出1 5 2 3

我们先创建一个长度为3的链表,然后使用insertAtIndex方法在第1个位置插入值为5的节点,然后使用traverse方法遍历链表,输出链表中每个节点的值。

示例2:从链表中删除节点

下面是一个示例,从一个长度为3的链表中删除一个值为2的节点。

ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution();
head = solution.deleteAtIndex(head, 1);
solution.traverse(head); // 输出1 3

我们先创建一个长度为3的链表,然后使用deleteAtIndex方法删除第1个位置的节点,值为2,然后使用traverse方法遍历链表,输出链表中每个节点的值。

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

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

相关文章

  • C语言入门之浮点数

    C语言入门之浮点数 什么是浮点数 在计算机中,浮点数是一种表示实数(即小数)的数据类型。与整数不同,浮点数的存储方式使用指数表示法,可以表示非常大或非常小的数值。在C语言中,浮点数类型为float或double,分别使用4字节或8字节的存储空间。 如何定义浮点数变量 在程序中定义浮点数变量的方法与定义整数变量类似,但需要使用浮点数类型的关键字float或do…

    other 2023年6月27日
    00
  • 递归之斐波那契数列java的3种方法

    递归之斐波那契数列Java的3种方法 什么是斐波那契数列 在数学中,斐波那契数列是以递归的方式定义的:前两个数字是0和1,随后每个数字都是前两个数字的和。 斐波那契数列的前几个数字是0、1、1、2、3、5、8、13、21、34……以此类推。 三种递归方法实现斐波那契数列 方法1:最基本的递归方法 这是最基本的递归方法,但是由于重复计算太多,不适合大规模的计算…

    other 2023年6月27日
    00
  • Illustrator CC 2015安装失败怎么办?adobe cc安装不了解决方法(安装问题汇总)

    标题:Illustrator CC 2015安装失败解决方法 如果你在安装 Illustrator CC 2015 时遇到了问题,可以通过以下方法进行解决: 1. 检查系统要求 首先,确保你的计算机符合 Illustrator CC 2015 的系统要求。如果不符合要求,安装程序可能会提醒你无法继续安装。 Illustrator CC 2015 的最低系统要…

    other 2023年6月27日
    00
  • 词根——rect详解

    词根——rect详解 “rect”是一个拉丁语词根,表示”直线、正直”等含义。在英语中,我们可以通过学习这个词根来更好地理解与其相关的词语的含义,提高单词记忆和阅读能力。 以下是常见的rect开头的单词: 1. rectangle “rectangle”表示”矩形”,指具有四个直角和四个直线边缘的平面图形。这个词是由”rect”和后缀”-angle”(表示角…

    其他 2023年4月16日
    00
  • 基于Android实现数独游戏

    基于Android实现数独游戏攻略 1. 简介 数独是一种经典的逻辑推理游戏,通过填写数字到9×9的网格中,使得每一行、每一列和每一个3×3的子网格中的数字都不重复。本攻略将详细介绍如何基于Android平台实现一个数独游戏。 2. 开发环境准备 在开始之前,确保你已经安装了以下开发环境:- Android Studio:用于开发Android应用程序的集成…

    other 2023年9月7日
    00
  • 关于python:使用numpy.take进行更快的花式索引

    以下是关于“使用numpy.take进行更快的花式索引”的完整攻略,包含两个示例。 使用numpy.take进行更快的花式索引 Python中,我们可以使用numpy.take方法进行更快的花式索引。以下是关于如何使用numpy.take方法的详细攻略。 1. 使用numpy.take方法 numpy.take方法可以根据索引数组从中获取元素。以下是一个示例…

    other 2023年5月9日
    00
  • HQL常用的查询语句

    HQL常用的查询语句 HQL(Hibernate Query Language)是Hibernate框架中用于查询数据的一种语言,类似于SQL。在HQL中,查询语句是面向对象的,使用Java类名及属性名代替SQL中的表名和列名,能够方便地进行对象导航和属性过滤。在本文中,我们将介绍HQL中常用的查询语句。 1. from语句 from Entity from…

    其他 2023年3月28日
    00
  • 爬虫简介、requests基础用法、urlretrieve()

    爬虫简介、requests基础用法、urlretrieve() 爬虫简介 爬虫(英文名:web crawler 或 spider),是一种自动获取网页内容的程序。网页内容包括:文本、图片、音频、视频等。爬虫工作的模式一般是模拟浏览器行为,向目标网站发送 HTTP 请求,获取响应数据,然后解析数据提取需要的信息。爬虫常用于搜索引擎抓取网页、数据分析、数据挖掘等…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部