数据结构 | LinkedList与链表

前言

  • ArrayList底层使用连续的空间,任意位置(尤其是0位置下标)插入或删除元素时,需要将该位置后序元素 整体 往前或往后搬移,故时间复杂度为O(N). 优点(给定一个下标,可以快速查找到对应的元素,时间复杂度为O(1))
  • 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗.
  • 增容一般是呈2倍的增长,势必有一定的空间浪费.例如当前容量为100,满了要扩容到200,当我们再插入5个数据,后面没有数据插入了,那么就浪费了95个数据空间.

那么此时,我们就思考,有没有一种数据结构,可以随用随取,插入/删除数据可以不移动元素?👉👉 

于此Java集合中又引入了链表结构.

链表的概念及结构

概念

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

生活中,火车是由许许多多的 车厢 组成 ;在链表中,则是由许多的 节点 组成.

        

  • 每一个节点都有地址. 是一个对象 ; null表示 不指向任何一个对象.
  • 第一个节点叫做 头节点head.可以认为head就是一个变量,该变量里面存了节点的地址. head是一个引用,这个引用指向个节点对象,就可以把链表里所有的元素都遍历.

结构 

组合一下有以下八种,但我们只需重点掌握 单向不带头非循环双向不带头非循环 结构.

 链表的实现

创建LinkedList类 实现IList接口

//模拟实现LinkedList链表
public class MySingleLinkedList implements IList {//定义一个静态内部类 --节点static class LinkedNode {public int value;//数值域public LinkedNode next;//next域 存放的是节点的地址public LinkedNode(int value) {this.value = value;}}public LinkedNode head;//head是 链表的头节点 nullpublic void createList() {LinkedNode node1 = new LinkedNode(12);LinkedNode node2 = new LinkedNode(23);LinkedNode node3 = new LinkedNode(34);LinkedNode node4 = new LinkedNode(45);node1.next = node2;//表示node1的下一个节点是node2 node2这个引用存储了地址node2.next = node3;node3.next = node4;this.head = node1;//head指向了第一个节点的地址}@Overridepublic void display() {LinkedNode cur = head;//定义临时变量while(cur != null) {   //当头节点为null时 算把所有节点都遍历完了System.out.print(cur.value + " ");cur = cur.next;//从第一个节点走到下一个节点}}@Overridepublic int size() {   //计算有多少个节点int count = 0;LinkedNode cur = head;while(cur != null) {count ++;cur = cur.next;}return count;}}
public interface IList {void addFirst(int data);void addLast(int data);void addIndex(int index,int data);boolean contains(int key);void remove(int key);void removeAllKey(int key);int size();void clear();void display();
}

解析

  •                 
  1. 在构造方法中,为什么不初始化next域? 是因为,当我们去插入一个节点时,首先要实例化该节点,但在构造完成这个节点之后,不知道这个next会是谁,所以next域的值应该为null.
  2. head是链表的头节点.是链表的属性,不是节点的节点.   初始值也为null.
  •     
  1. 实例化了四个节点的对象.
  2. node1的下一个节点是node2 , 用代码表示为 node1.next = node2; 同时node2这个引用变量存储的是0x987.
  3. this.head = node1; 表示 head 指向了第一个节点的地址
  •   
  1. head = head.next ; 从第一个节点走到 下一个节点.
  2. head = null ; 当head头节点为null时表示所有节点都被遍历了.
  3. 定义临时变量cur , 当遍历完后 head = null了就不指定头节点的位置了,我们希望的是 能够找到头节点的位置使得head始终指向第一个节点.
  4. 插入数据的时候 一定要先绑后面(该节点的下一个)的,因为可以通过遍历节点找到所有的节点 ; 而先把 头节点head这个引用指向该节点本身 , 再把该节点下一个指向head就找不到了,因为所指的是本身,后面的数据丢失了..

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

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

相关文章

【权威发布】第二届雷达、信号与信息处理国际会议(RSIP 2024)

第二届雷达、信号与信息处理国际会议 2024 International Conference on Radar, Signal and Information Processing 【1】会议简介 第二届雷达、信号与信息处理国际会议是一次聚焦雷达技术、信号处理及信息处理领域最新研究成果和前沿趋势的盛会。会议旨在汇聚国内外雷达与信号…

【Django】anaconda环境变量配置及配置python虚拟环境

文章目录 配置环境变量配置python虚拟环境查看conda源并配置国内源在虚拟环境中安装django 配置环境变量 control sysdm.cpl,,3笔者anaconda安装目录为C:\ProgramData\anaconda3 那么需要加入path中的有如下三个 C:\ProgramData\anaconda3 C:\ProgramData\anaconda3\Scripts C:…

【C++】类和对象(三)完结篇

个人主页 创作不易,感谢大家的关注! 文章目录 ⭐一、再探构造函数1.初始化列表 🎉二、类型转换🏠三、static成员🏝️四、友元⏱️五、内部类🎈六、匿名对象🎡七、在拷贝对象时的编译器优化 ⭐一…

火焰传感器 - 从零开始认识各种传感器【第十六期】

火焰传感器|从零开始认识各种传感器 1、什么是火焰传感器 火焰传感器是一种用于检测火焰或火光的传感器。它可以快速、准确地检测到周围环境中火源的存在,从而在火灾发生之初及时向消防人员或相关机构发送报警信息,以便及时采取措施进行火灾扑救。此外…

C# 贪吃蛇游戏

贪吃蛇游戏可分为手动玩法和自动玩法 冯腾飞/贪吃蛇

【网络安全学习】 SQL注入01:基础知识

💻 1. 什么是SQL注入 SQL注入是一种针对Web程序中数据库层的安全漏洞的攻击方式。它利用了程序对用户输入数据合法性的判断或过滤不严,允许攻击者在设计不良的程序中添加额外的SQL语句,从而执行计划外的命令或访问未授权的数据。攻击者可以通…

Docker搭建私有仓库harbor(docker 镜像仓库搭建)

Harbor介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目…

Android statsd 埋点简析

源码基于:Android U 0. 前言 最近在研究 Android 自带的系统数据指标采集功能,框架依旧很严谨、完美,这里做个分享。 1. Android S 之后变化 stats 的代码从 framework 或 system/core 中转移到了 packages/modules/StatsD 目录中。 2. 框架…

IEC104转MQTT网关轻松将IEC104设备数据传输到Zabbix、阿里云、华为云、亚马逊AWS、ThingsBoard、Ignition云平台

随着工业4.0的深入发展和物联网技术的广泛应用,IEC 104(IEC 60870-5-104)作为电力系统中的重要通信协议,正逐步与各种现代监控、管理和云平台实现深度融合。IEC104转MQTT网关BE113作为这一融合过程中的关键设备,其能够…

动手学深度学习V2每日笔记(模型选择+过拟合和欠拟合)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.788.recommend_more_video.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&a…

通过IEC104转MQTT网关轻松接入阿里云平台

随着智能电网和物联网技术的飞速发展,电力系统中的传统IEC 104协议设备正面临向现代化、智能化转型的迫切需求。阿里云作为全球领先的云计算服务提供商,其强大的物联网平台为IEC 104设备的接入与数据处理提供了强大的支持。本文将深入探讨钡铼网关在MQTT…

linux查看某个是否被占用以及释放端口

在 Linux 系统中&#xff0c;可以使用多种方法来检查某个端口是否被占用&#xff0c;并释放该端口。以下是详细的步骤&#xff1a; 1. 检查端口是否被占用 使用 netstat sudo netstat -tuln | grep <port_number>例如&#xff0c;要检查端口 8080 是否被占用&#xff…

UML通信图建模技术及应用例

新书速览|《UML 2.5基础、建模与设计实践》 在对系统的动态行为进行建模时&#xff0c;通信图常被用于按组织结构对控制流进行建模。与顺序图一样&#xff0c;一个单独的通信图只能显示一个控制流。 使用通信图建模时可以遵循如下策略&#xff1a; &#xff08;1&#xff09…

WinDbg用户模式调试基础

WinDbg用户模式调试基础 在前面的文章中&#xff0c;介绍了如何使用WinDbg分析蓝屏原因https://www.cnblogs.com/zhaotianff/p/15150244.html 不过那会都是在网上找的资料&#xff0c;东拼西凑出来&#xff0c;并没有系统的去学习WinDbg。 最近在学习内核开发这一块的内容&…

Arrays.asList()创建的集合不能使用remove函数

Arrays.asList() 创建的集合确实不能直接使用 remove 方法&#xff0c;这是因为该方法返回的集合是一个固定大小的列表&#xff0c;背后由一个数组支持。由于数组的长度是固定的&#xff0c;所以这个列表也不能增加或减少元素。 以下是详细解释和解决方案&#xff1a; 原因 …

顺序表的实现和操作

目录 一.前言 二. 顺序表的优缺点 三. 顺序表的定义和初始化 四.顺序表的相关操作 一.前言 首先介绍下线性表的定义&#xff0c;线性表是具有相同特性的数据元素的一个有限序列。而我们的顺序表就是线性表的一种&#xff0c;是线性表的顺序存储结构。所谓顺序存储就是把逻辑…

Photos框架 - 自定义媒体选择器(UI列表)

引言Photos框架 - 自定义媒体资源选择器&#xff08;数据部分&#xff09;-CSDN博客 关于自定义媒体选择器上一篇博客我们已经介绍了使用Photos获取媒体资源数据和处理媒体资源数据&#xff0c;有了数据&#xff0c;UI的实现就比较灵活了&#xff0c;我就以上面的设计样式为例…

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…

数学建模基础:数据的分析与模型构建

引言 在当今数据驱动的世界中&#xff0c;数学建模已成为解决复杂问题的关键工具。本篇文章将探讨数学建模的基础知识&#xff0c;特别是数据处理与拟合模型的重要性和方法。 第一部分&#xff1a;数据的重要性 数据是数学建模的基石。在开始任何建模工作之前&#xff0c;我…

Spring源码(六)--Bean生命周期相关的接口

Bean生命周期相关的接口 Bean生命周期接口相关的这些类和接口&#xff0c;都可以多看看。 Bean工厂实现应该尽可能支持标准的Bean生命周期接口。 整套初始化方法及其标准顺序为: * * <li>BeanNameAwares {code setBeanName}* <li>BeanClassLoaderAwares {code se…