Java链表ListNode详解

一、链表概述

链表是一种常用的数据结构,它存储一系列元素,这些元素由指向下一个元素的指针引用连接而成。链表是由节点组成的,每个节点包含一个数据元素和一个指向下一节点的指针。

二、Java中的链表

Java语言中的链表是通过节点(Node)的方式实现的,每个节点包含三个部分,即指向下一个节点的指针next、节点值value、以及一个前驱指针prev(如果是双向链表)。

三、ListNode类

Java中的链表通常是通过ListNode类来实现的。ListNode类是一个简单的类,包含一个值val和一个指向下一个节点的指针next。

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

四、链表的创建

在Java中,可以通过常规的方式来创建一个链表,首先声明一个头节点(head),然后在头节点后面逐个添加新节点。这里的新节点就是ListNode类的实例。

ListNode head = new ListNode(0);
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
head.next = node1;
node1.next = node2;

五、链表的遍历

链表的遍历是指按顺序依次访问链表中的所有节点。Java链表的遍历通常使用while循环,先访问头节点(head),然后循环访问后续节点,直到访问到null节点。

ListNode head = new ListNode(0);
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
head.next = node1;
node1.next = node2;
 
ListNode cur = head;
while(cur != null) {
    System.out.println(cur.val);
    cur = cur.next;
}

六、链表的插入

链表的插入指在链表的某个位置上插入新的节点。Java中链表的插入一般有三种情况,包括在链表的头部插入节点、在链表的尾部插入节点、在链表的指定位置插入节点。

(1)在链表头插入节点

首先需要创建一个新的节点,然后将新节点的next指向原来的头节点,最后将新节点赋值给头节点。

ListNode newNode = new ListNode(val);
newNode.next = head;
head = newNode;

(2)在链表尾部插入节点

遍历到链表尾部,然后在尾部添加新节点。

ListNode newNode = new ListNode(val);
ListNode cur = head;
while (cur.next != null) {
    cur = cur.next;
}
cur.next = newNode;

(3)在链表指定位置插入节点

在Java中,链表的插入是通过改变节点的指针来完成的。使用pre节点记录待插入位置的前一节点,然后先将待插入节点的next指向pre.next,再将pre.next指向待插入节点。

ListNode newNode = new ListNode(val);
ListNode pre = head;
for(int i=1; i<pos; i++){
    pre = pre.next;
}
newNode.next = pre.next;
pre.next = newNode;

七、链表的删除

链表的删除是指在链表中删除指定节点。Java中链表的删除分为删除头节点、删除尾节点和删除中间节点。删除链表节点时需要分别进行内存释放处理,以避免造成内存泄漏。

(1)删除头节点

将头节点指针移向下一节点。

head = head.next;

(2)删除尾节点

找到尾节点的前一节点pre,将pre.next置为null,然后释放掉尾节点。

ListNode cur = head;
while (cur.next.next != null) {
    cur = cur.next;
}
ListNode delNode = cur.next;
cur.next = null;
delNode = null;

(3)删除中间节点

找到待删除节点的前一节点pre,先将pre.next指向待删除节点的下一节点,再释放掉待删除节点。

ListNode pre = head;
for(int i=1; i<pos; i++){
    pre = pre.next;
}
ListNode delNode = pre.next;
pre.next = delNode.next;
delNode = null;

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/158296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-19 00:40
下一篇 2024-11-19 00:40

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • 利用Python实现两个链表合并为一个有序链表

    对于开发工程师来说,实现两个链表合并为一个有序链表是必须掌握的技能之一。Python语言在链表处理上非常便利,本文将从多个方面详细阐述如何利用Python实现两个链表合并为一个有序…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29

发表回复

登录后才能评论