数据结构 | 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://xiahunao.cn/news/3267364.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选

前面完成了JuanTree组件的节点编辑和保存功能后,我们把精力放到节点勾选功能实现上来。**注意,对于组件的开发者来说,要充分考虑用户的使用场景,组件提供的多个特性同时启用时必须要工作良好。**就拿Tree组件来说,用户…

标准IO

目录 思维导图: 学习内容: 1. IO基础 2. 标准IO 2.1 标准IO提供的内容 2.2 FILE结构体 2.2.1 结构体解析 2.3 fopen 打开文件 2.4 fclose:关闭文件 例如: 2.5 fgetc\fputc:单字符的输入输出 例如: 2.6 错…

概率论--最大似然估计

目录 概念 基本原理 应用领域 实际应用案例 优缺点 优点: 缺点: 延伸 最大似然估计在机器学习中的具体应用案例是什么? 如何解决最大似然估计在处理小样本数据时的偏差问题? 最大似然估计与其他参数估计方法&#xff08…

uniapp手写滚动选择器

文章目录 效果展示HTML/Template部分&#xff1a;JavaScript部分&#xff1a;CSS部分&#xff1a;完整代码 没有符合项目要求的选择器 就手写了一个 效果展示 实现一个时间选择器的功能&#xff0c;可以选择小时和分钟&#xff1a; HTML/Template部分&#xff1a; <picker…

【文件fd】文件描述符fd | 文件描述表

目录 1.文件描述符fd 2.系统调用的0/1/2 3.C语言的stdin/stdout/stderr 4.系统调用的0/1/2和C语言的stdin/stout/stderr二者的关系❓ 5.文件描述表 5.1 文件描述符概念 5.3 文件对象strcut file 5.4 进程和文件对应关系 5.5 文件描述符理解 5.6 源码查看 1.文件描述…

AI行业合适做必应bing推广吗?怎么开户呢?

快速发展的AI行业中&#xff0c;有效的市场获客渠道是关键&#xff0c;随着数字营销领域的不断演进&#xff0c;必应Bing以其独特的市场定位、庞大的用户基础和高效的广告系统&#xff0c;成为AI企业推广策略中的重要一环。特别是针对那些寻求精准触达、高效转化的AI企业而言&a…

C++初级学习:⼊⻔基础

本文内容&#xff1a; 1.C参考⽂档&#xff1a;2.C第一个程序3.命名空间3.1namespace的价值3.2namespace的定义3.3命名空间的使用 4.C输⼊&输出5.缺省参数6.函数重载 1.C参考⽂档&#xff1a; https://legacy.cplusplus.com/reference/ https://zh.cppreference.com/w/cp…

【React】JSX:从基础语法到高级用法的深入解析

文章目录 一、什么是 JSX&#xff1f;1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…

【C++】19.红黑树模拟实现 set 和 map

我们想要实现STL中的set和map&#xff0c;那么第一步就需要看一下库函数是如何实现的&#xff1a; 通过查看源代码我们发现两个容器都包含了stl_tree.h&#xff0c;因此我们猜测此头文件实现的是红黑树。 但是set和map很显然不是使用同一棵树实现的&#xff0c;那么STL库是怎么…

C# Nmodbus,EasyModbusTCP读写操作

Nmodbus读写 两个Button控件分别为 读取和写入 分别使用控件的点击方法 ①引用第三方《NModbus4》2.1.0版本 全局 public SerialPort port new SerialPort("COM2", 9600, Parity.None, 8, (StopBits)1); ModbusSerialMaster master; public Form1() port.Open();…

Beam Search 原理详解

文章目录 1. 前言2. 原理3. 举例4. 参考 1. 前言 Beam Search 是一种启发式图搜索算法&#xff0c;用于在图或树的搜索过程中寻找最有可能的路径。它常用于自然语言处理&#xff08;NLP&#xff09;中的序列生成任务&#xff0c;如机器翻译、语音识别和文本生成等。与穷举搜索…

渲染技术如何帮助设计内容实现从平面到立体的转换

随着数字艺术和视觉特效的飞速发展&#xff0c;三维建模与渲染技术在影视、游戏、广告、工业设计、建筑可视化等多个领域展现出了其不可或缺的重要性。这一技术不仅实现了从平面到立体的跨越&#xff0c;还极大地丰富了视觉表达的层次感和真实感。 三维建模&#xff1a;构建虚…

一站式企业服务平台有哪些特点和优势!

随着我国经济的快速发展&#xff0c;各地方政府及产业园区为了能够吸引投资和优质企业入驻&#xff0c;纷纷在营商环境优化上大下功夫&#xff0c;这是因为当下企业已经不再满足于基础服务&#xff0c;而是更看重利于企业发展的软环境&#xff0c;随之建设“一站式企业服务平台…

flex/lex使用和学习

flex/lex用于生成解析配置文件的C代码&#xff0c;我们可以不用自己手动去做解析的工作&#xff0c;交由他们生成的代码去做。 假设&#xff0c;我有如下一个配置文件config.xml 配置文件中定义了三种channel,分别为SSIF, IPMB, NET&#xff0c;每一种channel都有4个int属性&a…

PyTorch基础(24)--torch.multinomial()方法

&#x1f449;torch.multinomial的源码见https://github.com/dongjinkun/PyTorch/tree/main/torch 一、前言 torch.multinomial()方法多出现在需要采样的场景中&#xff0c;如强化学习。具体讲&#xff0c;当使用强化学习解决旅行商问题时&#xff0c;针对某一个instance&…

项目实战——外挂开发(30小时精通C++和外挂实战)

项目实战——外挂开发&#xff08;30小时精通C和外挂实战&#xff09; 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1&#xff0c;修改内存中的数据 2&#xff0c;更改内存中…

外文文献去哪个网站查找下载又快又准

今天收到好多同学的文献求助&#xff0c;大部分都是外文文献。那么外文文献去哪里查找下载比较好呢&#xff1f;本文小编就讲解一下自己平时是在什么网站上查找获取文献的&#xff0c;下面就用几篇求助文献演示一下获取过程&#xff1a; 第一篇、OVID数据库&#xff1a;A Crit…

录音教程分享:电脑在线录音,7款录音软件免费版公开!

在我们的日常生活中&#xff0c;不可避免地会遇到需要在电脑上录制各种系统内音频的场景。无论是记录一次讲座、一段对话&#xff0c;或者录制某个重要网站上的音频&#xff0c;这种需求变得愈发重要且广泛。然而&#xff0c;对许多人来说&#xff0c;在电脑上在线录音可能是一…

菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务” 针对有编程基础&#xff0c;开始学习微服务的同学&#xff0c;我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。 会分享的比较快&#xff0c;会记录demo演算和中间件的使用过程&#xff0c;至于细节的理论…

Spark_Oracle_II_Spark高效处理Oracle时间数据:通过JDBC桥接大数据与数据库的分析之旅

接前文背景&#xff0c; 当需要从关系型数据库&#xff08;如Oracle&#xff09;中读取数据时&#xff0c;Spark提供了JDBC连接功能&#xff0c;允许我们轻松地将数据从Oracle等数据库导入到Spark DataFrame中。然而&#xff0c;在处理时间字段时&#xff0c;可能会遇到一些挑战…