LinkedList与链表(单向)(Java实现)

引入链表结构:

ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后
搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。

一:链表

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

1:结构:

 链表中的元素可以抽象为对象,每一个对象包含一个val值与next值,next就是指向下一个节点的地址。,这样就实现了虽然物理上不连续,但是逻辑上实现了连续。

 

演示: 

 链表结构一共8中,分别是:

单向  带头  非循环     单向  不带头  非循环              双向  不带头  非循环   双向  不带头  循环 

 单向  带头  循环       单向  不带头    循环              双向    带头  非循环    双向    带头     循环 

2:实现:

 对链表的增删该查方法进行手动实现:

将链表抽象为对象,每一个对象中都包含一个val值与next值,将val与next初始化为内部类的成员属性,通过构造方法对传输的val值进行初始化,这样传输的val值就带有一个next属性,成为了一个对象。

代码解释: 

  next 是一个指向同类对象的引用

      1: 它存储内存中下一个节点对象的内存地址

      2: 类型为 ListNode 表示它只能指向另一个 ListNode 类型的对象

      3: 最后一个节点的 next 通常设为 null(表示链表结束

  public ListNode head; 的含义:

  1:head:变量名,表示链表的头节点(链表的起始点)

     2:返回ListNode对象,相当于这个head是一个ListNode对象,包含val属性与next属性(链               表由节点组成,头节点是链表的起点

  ListNode 作为返回类型意味着什么?

    1:  返回的是对ListNode 对象的引用(reference)

    2 : 引用本质上是对象的句柄,包含:

             2.1 对象的内存地址(但 Java 不直接暴露地址)

             2.2 通过引用可以访问对象的完整状态(字段)和行为(方法)

      初始化对象:

        当使用 new Node(value) 时:new 操作符在堆内存中分配空间创建新对象 → 生成新地址

       然后调用构造方法初始化对象状态

       最后返回该对象的引用(地址)  

 

 2.1:创建一个链表

ListNode node=new ListNode(val): 调用ListNode内部类,传入val值,然后调用构造方法初始化对象,最后形成链表(对象)。

2.2:display(打印链表)

2.3:size(链表长度) 

逐一遍历直到cur为null,也就是遍历完最后一个节点,最后一个节点的next的节点为null时,停止遍历,返回len。

2.4:findNodeOfKey(查找)

遍历cur,直到cur的val为key时,返回cur。

图示: 

2.5: remove(删除一个指定元素)

首先保证存在链表,如果要删除的key值为头节点,然后使head节点指向下一个节点,如果不是头节点则执行逻辑代码,先找到要删除节点的前一个节点,然后del保存为要删除节点的下一个节点,使cur.next指向要删除节点的下一个节点,这样要删除的节点直接被跳过了。

图示展示: 

2.6:removeAllKey(删除所有为key值的节点)

如果要删除的节点正好是head节点指向的下一个节点,那么执行if语句,删除(跳过)这个节点,使head指向它的next.next的节点,然后prev指向此时的cur,也就是被跳过的节点,然后cur指向cur的下一个节点,循环执行,如果要删除的节点包含头节点,那么最后删除(跳过)头节点,最后处理,不要先处理。

 

2.7:clear(删除所有节点)

删除所有节点可以直接将head==null这样链表就没有了头,其他节点也就自动被清理了。

也可以一个一个的将节点置为null。

 2.8:addFirst(头插)

将传输的data初始化为节点对象,调用构造方法,生成node对象,然后将node的下一个节点指向head节点,此时head节点使第二个节点,最后再将head置为第一个节点指向node。

2.9:addLast(尾插法) 

同理,生成node对象,先遍历到最后一个节点,然后将node插入到最后,此时cur==null,然后将cur.next=node,这样就再最后插入了node。

2.10:addIndext(在任意位置插入) 

首先确保插入位置合法,不超过链表的长度,也不为负数,也就是在index位置插入data值,那么cur需要走到index节点的前一个节点,也就是要走index-1步

2.11:contain(包含某个节点) 

遍历cur,从头节点开始,直到找到key的值,找到返回true,没有找到返回false

物理连续与逻辑连续:

  • 物理存储结构:指的是数据元素(节点)实际在计算机内存(或存储介质)中占据的位置。

      • 物理上连续的存储结构: 最典型的例子就是数组

        • 如何连续: 当你创建一个数组(例如 int arr[10];)时,操作系统或运行环境会在内存中找出一块连续的空闲区域,大小刚好能容纳10个整数(假设每个int占4字节,就是40字节的连续空间)。

        • 地址关系: 数组的第一个元素 arr[0] 占据某个起始地址(比如 0x1000),那么 arr[1] 紧挨着它,地址是 0x1004(假设int是4字节),arr[2] 在 0x1008,以此类推,直到 arr[9] 在 0x1024。这些元素的内存地址在数值上是连续的、紧密相邻的

        • 特点: 知道第一个元素的地址和每个元素的大小,就能通过简单的算术运算(起始地址 + 索引 * 元素大小直接计算出任何一个元素的物理地址,实现快速随机访问(O(1)时间复杂度)。

      • 物理上非连续的存储结构: 最典型的例子就是链表

        • 如何非连续: 当你创建链表的节点时,每次创建一个新节点(Node),系统只是在当前可用的任意空闲内存位置分配空间给这个节点。它完全不关心之前创建的节点或之后将要创建的节点在内存的哪个位置。

        • 地址关系: 假设链表有3个节点 A、B、C,逻辑顺序是 A -> B -> C。

          • 节点 A 可能被分配到地址 0x2000

          • 节点 B 可能被分配到地址 0x5000(很远,与 A 不连续)。

          • 节点 C 可能又被分配到 0x3000(在 A 和 B 之间,也不连续)。

          • 这些节点的内存地址在数值上没有任何规律,是随机分散在内存中的,彼此之间不是紧挨着的。

        • 特点: 你无法通过起始地址和索引计算出某个节点的物理地址。节点的物理位置是随机的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92500.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络--VLAN技术

目录 VLAN实验报告 一、实验拓扑 二、实验要求 三、实验思路 1、实验准备 2. VLAN 3. DHCP 自动分配 4、 全网可达验证 四、实验步骤 (一)交换机配置- VLAN 创建与接口划分 (二)路由器配置(R1&#xff0c…

网络基础17--设备虚拟化

一、传统MSTPVRRP的不足传统MSTPVRRP设计:规划复杂:需要详细规划VRRP多实例的Master归属、MSTP的VLAN和生成树实例归属,以及IP网段。收敛速度慢:故障恢复速度一般在秒级,VRRP收敛时间至少需要3秒,故障恢复速…

深入解析Hadoop资源隔离机制:Cgroups、容器限制与OOM Killer防御策略

Hadoop资源隔离机制概述在分布式计算环境中,资源隔离是保障多任务并行执行稳定性的关键技术。Hadoop作为主流的大数据处理框架,其资源管理能力直接影响集群的吞吐量和任务成功率。随着YARN架构的引入,Hadoop实现了计算资源与存储资源的解耦&a…

static 关键字的 特殊性

static 关键字的 “特殊性” 主要体现在其与类、对象的绑定关系,以及由此带来的一些反常规规则,具体如下:生命周期与内存位置特殊静态成员(变量 / 方法)随类加载而创建,随类卸载而销毁,生命周期…

win10系统Apache以 FastCGI方式运行PHP

文件下载及官方网站 VC运行库Latest下载页:Latest supported Visual C Redistributable downloads | Microsoft Learnapache httpd官网:Welcome! - The Apache HTTP Server Project下载页:Apache VS17 binaries and modules downloadphp官网:PHP: Hypertext Preprocessor下载页…

MCP与企业数据集成:ERP、CRM、数据仓库的统一接入

MCP与企业数据集成:ERP、CRM、数据仓库的统一接入 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我…

【milvus检索】milvus检索召回率

Milvus中两种核心查询方式:暴力搜索(Brute-force Search) 和 近似最近邻搜索(Approximate Nearest Neighbor, ANN)。 逐一计算相似度:这是暴力搜索,能保证100%找到最相似的向量,但速…

docker Neo4j

Day 1 :Docker Desktop 基础熟悉 运行官方 hello-world 测试: docker -run hello-world 运行 Nginx 体验容器暴露端口: docker run -d -p 8080:80 nginx -d --detach 以 分离模式 运行容器 -p --publish 设置 宿主机与容器的端口映射。…

Win10_Qt6_C++_YOLO推理 -(1)MingW-opencv编译

先上效果图: 因为是一个为了尝试跑通的demo,美观、功能都先忽略哈。 一、环境 库版本下载链接备注cmakecmake-4.1.0-rc2-windows-x86_64.msihttps://cmake.org/download/make x86_64-15.1.0-release-posix-seh-ucrt-rt_v12-rev0.7zhttps://github.com/…

day060-zabbix监控各种客户端

文章目录0. 老男孩思想-一个人的背书1. zabbix各种客户端1.1 Windows Server监控1.2 网络设备监控1.3 java应用监控1.4 前端监控java程序故障2. 相关项监控3. 思维导图0. 老男孩思想-一个人的背书 学历、能力、态度、特长、人品、口碑(身边的人、领导) …

OpenCV 官翻 2 - 图像处理

文章目录色彩空间转换目标色彩空间转换目标追踪如何确定要追踪的HSV值?练习图像的几何变换目标变换缩放翻译旋转仿射变换透视变换其他资源图像阈值处理目标简单阈值化自适应阈值化大津二值化法Otsu二值化算法原理其他资源练习图像平滑处理目标二维卷积(图…

动态路由协议基础

一、动态路由协议简介2.动态路由协议的基本功能二、动态路由协议分类对比项距离矢量(如 RIP)链路状态(如 OSPF)信息来源只听直接邻居说收集全网链路状态,自己建 “地图”计算逻辑邻居给的距离 1,简单累加用…

netstat -tunlp | grep的作用

​​一、命令整体结构解析​​命令由两部分通过管道符 |连接:netstat -tunlp:核心网络状态统计命令,输出指定类型的网络连接信息;grep:文本搜索工具,用于过滤 netstat的输出结果,仅保留符合特定…

教育数字化革命:低代码破局与未来展望

当下,教育领域正经历前所未有的深刻变革——教育数字化转型。这并非简单的技术叠加,而是从教育理念到模式的全方位重塑,已成为推动教育高质量发展、助力我国迈向教育强国的核心驱动力。数字技术正以前所未有的速度和力度,全方位重…

云服务器磁盘IO性能优化的测试与配置方法

云服务器磁盘IO性能优化的测试与配置方法在云计算环境中,磁盘IO性能直接影响着应用程序的响应速度和系统整体稳定性。本文将深入解析云服务器磁盘IO性能优化的关键技术路径,从测试方法论到配置调整方案,帮助运维人员突破存储瓶颈。我们将重点…

Python Day22 - 复习日

浙大疏锦行 Pythonday22 本周学习内容主要是有关降维的一些内容以及基本的数组操作: 数组的常见操作以及shape聚类算法的选择以及常用评估指标、聚类后的结果分析特征筛选方法:方差筛选、lasso等SVD进行降维常见的降维算法:LDA、PCA等

飞算JavaAI文字需求描述功能:高效驱动项目开发的智能解决方案

在数字化开发浪潮中,如何将模糊的需求快速转化为具体的开发指令,是提升项目效率的关键环节。飞算JavaAI推出的文字需求描述功能,以自然语言交互为核心,为开发者和项目管理者提供了一套高效、精准的需求转化与项目管理方案&#xf…

探索自然语言处理NLP的Python世界

文本预处理:数据清洗与标准化 在自然语言处理(NLP)的旅程中,文本预处理是至关重要的第一步。原始文本数据往往包含噪声、不一致性以及各种格式问题,直接影响后续模型的性能。文本预处理旨在将文本转化为统一、规范的格…

ECMAScript(简称 ES)和 JavaScript 的关系

ECMAScript(简称ES)和JavaScript的关系常常令人困惑。简单来说:ECMAScript是标准,JavaScript是实现。以下从多个维度详细解析它们的区别与联系: 一、定义与核心关系ECMAScript 标准化规范:由ECMA国际&#…

笔试——Day16

文章目录第一题题目思路代码第二题题目:思路代码第三题题目:思路代码优化(滑动窗口)第一题 题目 字符串替换 思路 模拟 当遍历到正常字符时,直接加入结果答案;当遍历到占位符时,按顺序使用arg…