由于转行的原因,最近打算开始好好学习,昨天看到了部分的LinkedList源码,并且看了一点数据结构的视频,现总结部分自己的心得体会,以供后期给现在的自己拍砖~

双向链表每一个元素都有数据本身加指向前一个元素的属性与指向后一个元素的属性。

下面对Java中LinkedList部分源码进行个人理解的分享:

LinkedList定义大小和头尾节点,构造方法。

定义Node节点,节点有三个属性,元素和前后指向。

添加:

125:在头节点之前新增元素的方法

126:将首节点赋值给f变量

127:用构造函数新创建一个节点,名为newNode,他的前节点为空,后节点为首节点

128:将新添加的节点赋值给first,成为新的头节点

129-132:判断原来头节点是否为空,如果为空则表明这个节点即是尾节点也是头节点,如果不为空则将原来首节点的前一个节点指向新节点。就是将新节点插入最前面变为新的首节点。

133:容量+1

134:变化+1

140-150:在尾节点新增元素,与头节点方法类似。

506:在给定位置添加元素的方法

507:调用检查索引位置方法,实则为检查传入索引是否越界,越界为>size或者<0

508-510:判断索引和容量大小是否相等,如果相等则在链表尾部插入元素。

511-513:如果大小不相等,则调用linkBefore方法插入元素,其中有node(index)方法。

558-562:检查索引是否越界,如果越界了则抛出索引越界异常,异常信息在outOfBoundMsg中

540-542:检查索引是否大于等于0且小于等于list的容量

549-551:异常信息的定义,输出索引和容量

node(index)方法:获取指定位置的node(非空)元素,返回指定位置index的元素。

569:判断索引是否小于容量的一半,如果索引小于容量的一半,则从头节点往后进行遍历。

570:将头节点赋值给x

571-573:从头节点往后遍历,直到找到索引对应的节点并返回。

574-580:如果索引大于容量的一半,则从尾部进行遍历,将指向前一个的元素赋值给x并返回

在succ前插入一个新的节点,该方法需要传入两个参数,第一个参数为想要插入的新的元素,第二个参数为原有节点,将第一个插入第二个之前~:

157:将原有节点的向前指向的地址赋值给pred

158:利用构造函数新创建一个newNode节点,该节点的前指向为succ原有的前指向地址,该节点的后指向为succ,可以理解为在原有的succ前面插入了一个新的元素

159:将succ的前指向地址设置为新插入的元素

160-161:如果succ的前指向为空,那么很显然新插入的元素就为首元素

162-163:如果不为空,那么将succ原来的前面元素的next属性设置为新元素,这样就插入新元素成功。

164:容量+1

165:变化+1

addAll方法:将集合插入LIST链表当中

addAll的具体实现:传入索引和集合两个参数,将集合在指定的位置插入

406:检查索引是否越界,具体实现在上面

408:将集合C转换为一个数组a

409:将数组a的长度赋值给numNew

410-411:如果数组长度为0,则返回false

413:声明插入节点的前后两个节点

414-416:判断索引是否等于容量,如果等于那么插入位置的后节点就为空,前节点为最后一个节点

417-421:如果不等于容量,就将后节点赋值为index的元素,前节点赋值为后节点的前节点

422-424:遍历a数组,将元素存储到o里面再放入e中,然后新建节点对象,放入newNode中

425-430:如果插入位置为链表头,那么将其放入链表头部位置。

432-433:如果插入位置为尾端,则将尾部节点重置。

434-437:如果不在尾端,将链表连起来

439-441:容量增加,变化增加。

offer方法,默认在尾部插入新元素

默认在头部插入新元素

默认在尾部插入新元素

检索:

该方法通过索引获取元素并返回该元素

首先检查索引是否越界,然后通过node方法返回指定索引的元素

获取首节点元素的方法

将首节点元素赋值给f变量,然后对f进行判断,为空则抛出异常,不为空返回f元素

element方法也是调用获取首元素的方法。

peek方法也是返回首节点,只是不抛出异常而已。

getLast和peekLast都是获取最后一个元素,区别为一个抛出异常,一个不抛出异常。

从头结点向尾结点遍历,并返回第一个匹配的索引

从尾结点向头结点遍历,并返回最后一个匹配的索引。

判断对象是否在链表中,实际为调用indexOf方法进行循环遍历前后节点来判断

删除:

从链表中删除一个指定的对象

356-362:判断需要删除的元素是否为null,如果为null,则从前往后遍历,将所有的为null的元素进行unlink操作,并返回true

363-370:如果删除的元素不为Null,那么也从前往后遍历,将所有的元素进行unlink操作,并返回true

unlink该方法为删除指定元素的方法

211-213:声明element为需要删除的元素,next为需要删除的元素的后指向,prev为需要删除元素的前指向

215-217:如果需要删除的元素的前指向为空,那么需要删除的元素就为首节点,将第二个元素赋值给首节点即可,这样链表中就没有原先的x也就是原先的首节点了,实现了删除节点的效果。

218-220:如果需要删除元素的前指向不为空,就将需要删除的节点的后指向赋值给需要删除的节点的前面的元素的后指向,然后将需要删除元素的前指向设置为空,这样就可以把需要删除的元素分割出来,和其他的链表元素没有连线关系,实现了删除节点的效果。

222-224:如果需要删除的元素的后指向为空,那么需要删除的元素就为尾节点,将原先倒数第二个元素赋值给尾节点即可,这样链表中就没有原先的x也就是原先的尾节点了,实现了删除节点的效果。

225-227:如果需要删除的元素的后指向不为空,那么将需要删除的元素的前指向赋值给需要删除的后一个元素的前指向且将删除元素的后指向设置为空。这样就实现了删除节点的效果。

229-233:将需要删除的元素设置为空,容量减一,变化+1,返回这个元素。

该方法删除指定索引的元素

524-527:判断索引是否越界,调用unlink方法进行删除。

以上三个都是删除元素的方法,默认删除头结点

该方法为删除尾结点的方法

个人小理解:LinkedList是基于双向链表,其内部的实现源于对双向链表的操作,所以适用于频繁增加、删除的情况,俗称增删快,在链表的头尾添加或者删除元素的时候,通过源码就可以看出直接就在链表头尾改了个指向,效率很高,但是在增删位于链表中间的元素时,就需要进行遍历,看插入节点的位置距离头尾节点的长度进行遍历,越往中间越耗时。查询的时候会调用node方法进行从头尾遍历,进行查询,而ArrayList有索引,故相较于ArrayList来说,LinkedList的查询速度不够快。

对LinkedList源码的一些个人理解的更多相关文章

  1. 给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析

    LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明.   1.链表的概念      链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链 ...

  2. LinkedList源码解析

    LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明.1.链表的概念链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链表又分为单向链表和 ...

  3. ArrayList 和 LinkedList 源码分析

    List 表示的就是线性表,是具有相同特性的数据元素的有限序列.它主要有两种存储结构,顺序存储和链式存储,分别对应着 ArrayList 和 LinkedList 的实现,接下来以 jdk7 代码为例 ...

  4. Android版数据结构与算法(三):基于链表的实现LinkedList源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. LinkedList 是一个双向链表.它可以被当作堆栈.队列或双端队列进行操作.LinkedList相对于ArrayList来说,添加,删除元素效 ...

  5. Java集合:LinkedList源码解析

    Java集合---LinkedList源码解析   一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据re ...

  6. Java集合框架之二:LinkedList源码解析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! LinkedList底层是通过双向循环链表来实现的,其结构如下图所示: 链表的组成元素我们称之为节点,节点由三部分组成:前一个节点的引用地 ...

  7. 自己根据java的LinkedList源码编写的一个简单的LinkedList实现

    自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...

  8. LinkedList源码及原理

    简介 内部结构分析 LinkedList源码分析 构造方法 添加(add)方法 根据位置取数据的方法 根据对象得到索引的方法 检查链表是否包含某对象的方法: 删除(remove/pop)方法 Link ...

  9. Java集合基于JDK1.8的LinkedList源码分析

    上篇我们分析了ArrayList的底层实现,知道了ArrayList底层是基于数组实现的,因此具有查找修改快而插入删除慢的特点.本篇介绍的LinkedList是List接口的另一种实现,它的底层是基于 ...

随机推荐

  1. 用一个python文件去调用另一个python文件,关于相对路径的处理?

    比如用a.py调用执行b.py,但是a.py和b.py路径环境不一样,而b.py中有使用相对路径读取文件,这时会报错,怎么在a.py中进行配置,使其调用b.py时路径和其相同,能否做到? 比如目录结构 ...

  2. Python 图像处理 OpenCV (1):入门

    引言 又开一个新的系列分享,对图像处理感兴趣的同学可以关注这个系列. 更新频率尽量保持一周两到三次推送. 新系列第一件事儿当然是资源推荐,下面是一些有关 OpenCV 的资源链接: 资源链接: 官方网 ...

  3. ios中fixed元素在滚动布局中的延时渲染问题

    在之前做的一个demo中,有个视图是内滚动的,里边有个bar用了fixed,不是fixed在最外层视图的顶部和底部,在微信/safari/chrome/其他浏览器app上都没出现问题. 然后今天,我把 ...

  4. SSH三大框架知识点

    Hibernate ****************************************************************************************** ...

  5. js倒计时 手机休眠时 时间不进行减少

    http://www.111cn.net/wy/js-ajax/94218.htm 手机版网页js倒计时存在的问题与解决的方法 www.111cn.net 更新:2015-09-16 编辑:kp123 ...

  6. Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)

    1.简介 上一篇中宏哥已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先宏哥给大家介绍一下如何来创建一个测试计划(Test Plan). 2.创建一个 ...

  7. 小BUG大原理:重写WebMvcConfigurationSupport后SpringBoot自动配置失效

    一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小 BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小 BUG 我了解到不少 ...

  8. 【IOS】点击按钮-去高亮-加点击效果

    (1)前提:html页面 ,手机端, (2)问题一: 在iphone上(貌似是9以后..),给div/span/...等元素上加onclick事件,根本不起作用,这是为啥捏? -- 在元素上加  cu ...

  9. 实验一:Linux系统与应用准备

    项目 内容 这个作业属于哪个课程 班级课程 这个作业的要求在哪里 作业要求 学号-学号 17043133-木腾飞 作业学习目标 (1)学习博客园软件开发者学习社区使用技巧和经验:(2)学习Markdo ...

  10. C#网络编程入门之TCP

    目录: C#网络编程入门系列包括三篇文章: (一)C#网络编程入门之UDP (二)C#网络编程入门之TCP (三)C#网络编程入门之HTTP 一.概述 UDP和TCP是网络通讯常用的两个传输协议,C# ...