Java开发 - 双链表其实不可怕

news2024/11/20 2:39:28

前言

说起链表,那还是当初上学的时候学习的,印象里就觉得像锁链一样一环扣一环,后来工作后就几乎没实际接触过链表,每当遇到链表,总是不知道该怎么讲,因为对链表的本质一无所知。也是在学习了Java后,才明白了链表的运行机制,原来如此简单,这里将和大家一起来分享双向链表的一些知识。

什么是双向链表

链表是一种数据结构,由若干个节点组成,每个结点又分为三部分:前驱节点,元素,后继节点。双向链表中的结点是以游离状态存在的,意思是非连续的,这让我们想到了数组,因为数组中的数据是连续存在的,在内存上也是如此。

用一张图来表示双向链表的结构,第一个是头节点,最后一个是尾节点,头尾不能相连,否则就是另一种数据结构,后面再说。

双向链表在Java中的使用

LinkedList

在上面的图中,我们认为中间部分保存的是对象,但实际上保存的是对象的地址。

为了便于说明,后面我们将针对LinkedList来进行讲解。

LinkedList的演化

从JDK1.8开始,LinkedList的数据结构为双向链表
在JDK1.8之前,LinkedList的数据结构是双向循环链表(头尾相接),如下图

LinkedList的查询方式  

双向循环链表的查找过程与双向链表相同,都遵从下面的原则:

对半查询:

  • 小于一半,则从header开始顺序查找;
  • 大于一半,则从header开始逆序查找,双向链表头尾不相连,则从尾部开始逆序查找。

增加元素

//在链表尾部添加元素,创建一个新节点,并让新节点和上一个节点建立双向链表的关系
add(E)
//在指定位置插入元素,先断开对应位置的链,然后重新构建此位置前后链的关系
add(int index,E e)
	

删除元素

//删除指定位置的元素,实际上是断开对应位置链,
//并将移除后的位置前后的元素重新构建链的过程
remove(int index)

修改元素

//将新元素替换指定位置的元素
set(int index,E e)

查询元素

//查询方式:对半查找
//若查找的位置小于链表长度的一半,则从头结点开始顺序查找。否则,从尾结点开始逆序查找。
get(int index)
	
	

ArrayList和LinkedList的区别

  • ArrayList底层实现是数组,而LinkedList底层是双向链表;
  • 数据结构不同,则性能不同;

为什么不直接说谁性能好呢?这个不好说,我们慢慢往下看。

查询比较

ArrayList是数组实现的,它有下标,查询效率非常高,时间复杂度为o(1)。

LinkedList我们已经看过它的数据结构,说讲它查询的方式:对半查找。所以查询头尾元素效率很高,若是中间元素,那么效率将取决于LinkedList的大小和元素所处位置是否靠近头尾,所以效率偏低。

时间复杂度:o(1)    o(n) 用来衡量数据结构/算法效率的一个标志,n值越小,查询效率越高。

增删比较

ArrayList在尾部增删元素,效率会很高,若是在非尾部增删,则该位置之后的所有元素都需要中心排列。所以,其效率不高。

LinkedList在头尾进行增删元素,效率会很高,若是在靠近中间部分进行增删,效率则偏低,这是因为增删需要先查询,查询的效率低了,增删效率也会跟着低。

对比总结

ArrayList查询性能高于LinkedList,但若是首尾查询,LinkedList的效率也很高。

对于增删,头尾部增删,用LinkedList,其他部位增删,ArrayList和LinkedList半斤八两。

总的来说,ArrayList偏向于查询,所以我们在实际开发中用ArrayList更多。

结尾

结尾附上LinkedList源码,感兴趣的小伙伴自行下载查看,另外,关于链表,在后面的二叉树部分还会有部分涉及,欢迎持续关注。

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

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

相关文章

即将2023年了,我好想念那些2022年离职的兄弟

☆ 2022年终于即将要过去了,从年初开始,就有小伙伴不断的离开,10% 15% 20%,陆陆续续的。被裁的同学还拿着赔偿走了,不管未来怎么样吧,当下总算一身轻了。 ☆ 留下的其实一点也不轻松,以下这些经…

Anchor Based和Anchor Free的相爱相杀与ATSS的诞生

前言 我们都知道按照是否出现RPN可将目标检测算法分为two-stage和one-stage,其中one-stage的一个主要代表便是YOLO系列,而根据是否存在先验锚框的定义我们也可以将其分为Anchor based和Anchor free两类,关于这两种也是各有优劣,但…

7-7 静静的推荐

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的: 只考虑得分不低于 175 分的学生;一共接受 K 批次的推荐名单;同一批推荐名单上…

入职软件测试一年多,薪资正常应该有多少?

软件测试这个行业我见过工作5年依然是初级水平的功能测试,拿着不到1W的薪资,也见过1年时间达到高级自动化水平的大牛学霸!拿着25K的薪资。 影响你薪资的有两点! 一、你的技术水平高低直接决定你薪资的多少,工作时间长…

谷粒学院——Day14【首页课程和名师功能】

❤ 作者主页:Java技术一点通的博客 ❀ 个人介绍:大家好,我是Java技术一点通!( ̄▽ ̄)~* 🍊 记得关注、点赞、收藏、评论⭐️⭐️⭐️ 📣 认真学习,共同进步!&am…

数字硬件建模SystemVerilog-组合逻辑建模(4)组合逻辑决策优先级

数字门级电路可分为两大类:组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点,在后面会作为单独的主题处理。组合逻辑描述了门级电路,其中逻辑块的输出直接反映到该块的输入值的组合,例如,双输入AND门的输出…

四点流程做好商机管理

企业想做好商机管理,仅凭员工是做不到的,借助CRM销售管理系统是比较明智的选择。接下来小编从客户信息管理、业务进程跟踪、设置提醒、销售漏斗等方面讲讲企业如何做好商机管理。 只有提高商机的转化率,企业的利润才会增长。想做好商机管理&…

MySQL 索引事务 · 讨论适合索引的数据结构 · N叉搜索树 · B+树 · 聚簇索引与非聚簇索引 · 事务的四个核心特性

一、索引1.1 概念1.2 作用1.3 讨论-如何提高查询的速度合适的数据结构:二叉搜索树AVL 树红黑树哈希表以上数据结构的问题:N 叉搜索树B 树B 树1.4 索引的使用场景1.5 索引的使用1.6 聚簇索引与非聚簇索引聚簇索引非聚簇索引1.7 索引 - 小结二、事务2.1 为…

小程序-会议OA项目-首页

目录 一,flex弹性布局 什么是flex布局? flex属性 flex-direction属性 学习地址: OA项目搭建以及flex布局演示 二,轮播图--组件的使用 1.先去官方文档中查看轮播图组件如何使 2.在开发工具中查看演示及修改代码 3. 使用mock…

异步通信技术AJAX | 基于JSON、XML的数据交换

目录 一:快速搞定AJAX(第二篇) 1、JS中如何创建和访问JSON对象 2、基于JSON的数据交换(重点) 3、基于XML的数据交换(了解) 一:快速搞定AJAX(第二篇) 1、…

-source1.5中不支持diamond运算符解决办法

写了几年代码了, 回到最初了遇到了bug了,没有仔细思考,以为很容易,起始走到了误区,有种打了一辈子鹰,最后被麻雀啄了眼 de 感觉 首先来看一下我们的错误信息,如下: [ERROR] Failed…

相机标定笔记(2) -- 标定实践

标定板 为什么需要标定板? 相机标定的第一篇笔记中提到了相机标定所使用的模型,标定算法中我们需要一些可靠的样本点,这些样本点由世界坐标系中的3D点和其在图像上的2D像点组成。用这些2D和3D点对来求解标定参数。为了构建更高精度的3D和2D点&#xff0…

对于系统架构来说,要么进化,要么死亡

在亚马逊云科技年度re:Invent,亚马逊首席技术官Dr. Werner Vogels的主题演讲历来涵盖大量科学和技术领域,今年的演讲也不例外,座无虚席。现在,亚马逊云科技 2022 re:Invent 中国区 recap 正式也开始了,欢迎大家积极参与…

单例模式之饿汉模式懒汉模式

前言 单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例,比如 JDBC 中的 DataSource 实例就只需要一个。单例模式具体的实现方式有"饿汉" 和 "懒汉" 两种。 1.饿汉模式(类加载的同时创建实例&…

SOLIDWORKS装配体如何快速导出BOM丨慧德敏学

BOM作为产品数据的组成部分,它的重要性不言而喻。采购需要BOM、成本核算需要BOM、领料加工和装配需要BOM、录入ERP需要BOM……可以说,BOM与图纸同样重要,有些产品,可以没有图纸,但是不能没有BOM。借助SOLIDWORKS BOM插…

带你打开C语言的大门

最近有刚开始学习编程的同学问我:“C语言是什么?C语言是怎么来的?C语言用来干什么?”。对,在学习C语言之前,首先了解C语言的发展例程,这应该是每一个刚刚开始学习C语言的人应该了解的&#xff0…

什么是"文件表项"

从Linux的层次角度来说,在用户空间是存在这样的概念的,这个概念是存在内核空间的,而且是针对打开的文件的! 内核用三种数据结构来描述一个打开的文件。 数据结构一: 文件描述符表(descriptor table): 每个进程都有它独立的描述符表…

【代码调试】《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》

论文地址:https://arxiv.org/pdf/2103.05950.pdf 代码地址:https://github.com/megvii-research/FSCE 论文阅读:https://blog.csdn.net/qiankendeNMY/article/details/128390284 我的配置: Python :3.8(ubuntu18.04) …

小程序发布体验版流程

一、微信开发者工具操作 1. 点击 工具 -> 上传(或 直接点击右上角“上传”按钮) 【注意】 如果使用的测试 appid 则【上传】按钮不能点击,必须使用真实 appid 2. 如果之前有发布过体验版,会提示继续操作将会覆盖之前的体验版…

MyBatisPlus ---- 基本CRUD

MyBatisPlus ---- 基本CRUD1. BaseMapper2. 插入3. 删除a>通过id删除记录b>通过id批量删除记录c>通过map条件删除记录4. 修改5. 查询a>根据id查询用户信息b>根据多个id查询多个用户信息c>通过map条件查询用户信息d>查询所有数据6. 通用Servicea>IServi…