链表的详细介绍

news2025/2/4 6:02:24

目录

链表的简单定义:

链表的分类

单项带头非循环

单向不带头循环链表

实现单向非循环无头链表

定义链表:

实现链表方法

打印链表

头插法:

尾插法:

指定插入:

通过对应值删除节点:

删除所有对应值节点:

​编辑

LinkedListd的介绍

LinkedList的定义:

LinkedList的有参构造方法:

LinkedList的打印:

ArrayList和LinkedList的简单区别:


链表相对于数组优点: 插入或者删除元素的时候不需要移动其他的数据,且也不需要扩容

链表的简单定义:

链表中每个元素称为节点,每个节点由两部分组成(单向链表):数值和next域,next域存储下一个节点的地址,例如下图,可知链表在内存上不一定连续

链表的分类

单向(双向) 非循环(循环) 不带头(带头)链表,三者排列组合后可知有8种链表;

我们主要学习两种:单项不带头非循环链表(笔试和面试的考量对象)以及双向不带头非循环链表(LinkedList的底层逻辑)

简单认识一下:

单向带头非循环

头结点的数值域没有实际作用

单向不带头循环链表

这个head不是指0x112处这个节点而是只存放0x112这个地址值。

实现单向非循环无头链表

定义链表:

链表又节点和头节点组成,每个节点又由数值和next域组成,那么我们可以把节点定义做内部类‘

定义成静态内部类比较方便应用,再者为什么next的类型时ListNode呢,因为每个节点的nxet域是指向下一个节点的,因此头节点和next的类型均为ListNode;同时因为每个链表的头结点只有一个,所以应该定义在LIstNode之外。

实现链表方法

方法的实现方法有很多,一下只是讲述提供案例而已,只要能完整实现即可

在实现链表方法之前我们首先要学会如何将链表的节点连起来:

如图创建了四个节点,通过next将每个节点连起来;

所需要实现的方法:

  //头插法
        public void addFirst(MyStringLeList.ListNode node);
        //尾插法
        public void addLast(MyStringLeList.ListNode node);
        //任意位置插入,第一个数据节点为0号下标
        public void addIndex(int index, MyStringLeList.ListNode node);
        //查找是否包含关键字key是否在单链表当中
        public boolean contains(int key);
        //删除第一次出现关键字为key的节点
        public void remove(int key);

        //删除所有值为key的节点
        public void removeAllKey(int key);
        //得到单链表的长度
        public int size();
        //清空链表
        public void clear();
        //打印链表
        public void display();

打印链表

打印链表的时候只需要判断循环的结束条件和节点的传递即可;图中把head赋给cur是为了不遗失头节点

记数链表中节点个数;判断链表中是否有某个值:

这两个方法同打印类似较为简单,不多赘述。

头插法:

注意二者赋值顺序即可。

尾插法:

首先要判断链表是否为空;同时要注意循环的判断条件是cur.next而不是cur。cur.next !=null时,cur指向是最后一个节点。

指定插入:

指定插入我们要分情况,如果越界我们会抛出异常,如果是头,尾插那直接调用方法;这里需要注意的是,如果我们需要插入第三个位置,那么应该找到第二个位置的节点,因为单向链表只能向后传递,如果找到的是第三个节点那么就无法访问到第二个节点,从而不能通过第二个节点的next去连接插入的节点。相反当找到第二个节点之后可以通过next访问第三个节点;通常我们要先连接好后面的节点再来管前面的

通过对应值删除节点:

我们要考虑链表是否为空,如果为空那么return即可,如果不为空那我们就进行删除;即将所需删除节点的前一个节点的next指向所删除节点的下一个节点(上图最后一行);因此我们首先要找到前一个节点,实现过上述方法可知想要找到当前节点那么while条件为cur.val;那么显而易见若想循环结束时cur是前一个节点,条件自然为:cur.next.val;写完后分析代码可知,这无法删除第一个节点,因此要另外写一个条件。

如果观察深入可知,起始对应值的节点并未正真删除只是之前的节点不再指向它,但是它依然存在并指向原本的下一个节点,此时我们要想真正删除,只有一个cur是不行的,因为我们一旦改变了对应值前一个节点的引用那我们就无法找到对应值的节点,因此我们的做法是再增添一个curNext去指向它,将curNext,next设置为空即可。

在上图基础上增添两行代码即可。

删除所有对应值节点:

和上个写法大致相同,有一点需要注意,此时必须将头节点值判断放在后面;因为删除节点1后,节点2又变成了头部,那么我们又需要去单独判断该头部是否需要被删除。因此我们可以先将头部后面的都整理完再回头看头部节点即可。

同时要注意判断链表是否为空。

我在刷题专栏中精选了而多道链表题并附有讲解,大家可以去检验一下自己学的如何

LinkedListd的介绍

LinkedList的定义:

链表的集合类;

LinkedList是个双向不带头非循环链表。

包含数值域,next域(指向下一个节点),prev域(指向前一个节点)

LinkedList的常见方法:

在前面已经实现过了单向链表,双向链表就会很简单,把方法过一遍就可以了;

我们实现方法时默认链表是int,这只是为了方便起见,实际上LinkedList是一个泛型类;

我们为了更好的认识LinkedList来看一下其部分源码:

LinkedList的有参构造方法:

LinkedList里的参数是Collection<? extends E>c,这里我在ArrayList有讲过:

ArrayList实现了Collection这个接口,同时我们定义的arrayList是Integer,所以满足上诉条件;简而言之就是说在实例化LinkedList时我们可以传入一个集合(已经实现过Collection接口),将这个集合类型转为LinkedList类型(LinkedList也是一种集合,即一种集合类型转为另一种集合类型)。

LinkedList的打印:

LinkedList可以用foreach打印也可以用迭代器打印,如上图,在这里不多赘述。

ArrayList和LinkedList的简单区别:

从插入,查找,修改,删除来区分

1 二者均为List接口下的两个集合,二者内部实现方面不同:ArrayList的底层是由数组实现的,通过索引访问数组元素,可以快速访问,二LinkedList的底层是由双向链表实现的,适合插入和删除元素;

2  数据访问的时间复杂度不同:ArrayList的访问时间复杂度时O(1)LinkedList时O(n)

3  空间占用,ArrayList的占用空间是连续的,但会产生空间碎片,即扩容出来的空间是多余的,而LinkedList不是连续的,但需要通过前后的引用,占用空间相对较大。

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

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

相关文章

Unity向Web服务器上传和下载图片

Unity向Web服务器上传和下载图片 如果本片有看不懂的请查看我上篇文章&#xff1a;[Unity与Web服务器Post&#xff0c;Get](https://blog.csdn.net/qq_42194657/article/details/103031573)一、上传和下载图片1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Textu…

.json文件转为.dll文件后还能读取吗?

(只是修改了后缀名而已&#xff0c;做一个伪装&#xff09; 测试&#xff1a; QFile file(QApplication::applicationDirPath() "/config.dll");qDebug()<<QApplication::applicationDirPath() "/config.dll";if (file.open(QIODevice::ReadOnly))…

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…

西门子博途怎么使用PID_Compact做pid调试

到目前为止&#xff0c;我已经在S7-1200中创建了一个可运行的PLC程序&#xff0c;并在Basic Panel中创建了一个HMI项目来操纵和操作该程序。 引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 现在&#xff0c;我们该如何深入的让程序开始逐渐智能化呢&#xff0c…

少儿编程加盟培训机构管理系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着少儿编程教育的快速发展&#xff0c;加盟培训机构的数量不断增加。为了更好地管理学员信息、课程安排、教师工资等&#xff0c;需要开发一款少儿编程加盟培训机构管理系统源码。 &#xff08;二&#xff09;项目…

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…

12.鸿蒙HarmonyOS App(JAVA) page的隐式跳转

跳转到指定Page的指定AbilitySlice MainAbilitySlice按钮触发事件&#xff1a; btn.setClickedListener(component -> { Intent _intent new Intent(); Operation operation new Intent.OperationBuilder() .withBundleName(…

C++ std::string使用效率优化

字符串操作是任何一个C开发程序无法绕过的点&#xff0c;很多时候针对字符串的操作需要进行优化&#xff0c;从而达到更优的使用效率和内存利用率。一般会采用标准的std::string替代C字符串&#xff0c;一方面是std::string为一个成熟的类对象&#xff0c;其成员操作基本能满足…

std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用 在std::string中&#xff0c;capacity()为当前string占用内存字符的长度&#xff0c;表示当前string的容量&#xff0c;可以理解为一个预分配制度&#xff0c;如果当前的string不断进行扩展操作&#xff0c;则不需要每次都进行内存上的分配&#xff0c;提高程…

CentOS7搭建Elasticsearch与Kibana服务

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2拉取elasticsearch镜像 docker pull elasticsearch:7.11.1 1.3.运行 运行docker命令&#xff0c;部…

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

罗门哈斯同级抛光树脂:单晶硅电池超纯水生产与应用

在光伏行业中&#xff0c;单晶硅电池是最高效和最可靠的太阳能电池之一。然而&#xff0c;生产单晶硅电池需要使用超纯水&#xff0c;这是许多光伏制造商所面临的一个挑战。那么&#xff0c;超纯水是如何生产的呢&#xff1f; 为什么需要超纯水&#xff1f; 超纯水是一种高纯…

vue3 setup + ts 项目模块找不到问题解决:Cannot find module ...

Vscode contrl shift p 打开vscode配置面板&#xff0c;查找typescript&#xff1b;是使用workspace version,完事儿

EternalBlue【永恒之蓝】漏洞详解(复现、演示、远程、后门、入侵、防御)内容丰富-深入剖析漏洞原理-漏洞成因-以及报错解决方法-值得收藏!

漏洞背景&#xff1a; 1.何为永恒之蓝&#xff1f; 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子…

JavaScript基础练习题解析与实践

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

HarmonyOS4.0系统性深入开发04UIAbility组件详解(下)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启…

LSTM的记忆能力实验 [HBU]

目录 模型构建 LSTM层 模型训练 多组训练 模型评价 模型在不同长度的数据集上的准确率变化图 模型汇总 总结 长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的…

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…

【QML-按钮】

QML编程指南 VX&#xff1a;hao541022348 ■ 按钮■ AbstractButton■ Button■ CheckBox■ DelayButton■ RadioButton■ RoundButton&#x1f31f;■ Switch&#x1f31f;■ ToolButton&#x1f31f; ■ 按钮 ■ AbstractButton 所有的按钮控件的父类都是 AbstractButton 。…