LinkedList 的插入和删除 (双向链表)

LinkedList底层是双向链表的结构,内部维护了3个成员变量,一个是当前链表的头节点,一个是尾部节点,还有是链表长度。
在这里插入图片描述

双向链表 :有序,可重复 ,插入删除快,查找效率慢。
下面我们创建一个LinkedList 集合,看看到底是如何进行插入和删除操作的。
在这里插入图片描述

插入一个元素 add方法,调用linkLast方法
在这里插入图片描述
直接看linkLast方法
在这里插入图片描述

  1. 最后一个节点指向l,
  2. 创建一个Node对象,将我们要插入的元素放在最后一个节点l的后边。
  3. 将创建的newNode对象指向last
  4. 判断,如果最初的Node对象last节点为null,那么将插入的对象直接放在第一个节点的位置,(比如我们第一次插入“1”这个元素,默认把“1”直接放在首位);如果Node对象中的last不是null,就将插入的元素节点放到最后一个节点last的下一个位置。比如我们刚刚已经插入了“1”,那么Node对象last已经不是null,因为现在的first和last都是“1”所以再插入第二个元素“7”的时候,会放到“1”的后边,一次类推插入剩下的元素1,7,5,8.
  5. 没执行一次插入操作,集合长度+1,修改次数+1.

整个插入操作就是这样完成的,可能有些混乱,没关系,我们去看看Node对象,或许就清楚了。
在这里插入图片描述

当我们创建一个Node对象的时候,默认都会有三个对象,当前节点,下一个节点,上一个节点
在这里插入图片描述
加入断点我们看一下,我们插入的元素所在节点的前后节点都是什么
上图 可以看到 first > next >next >prev,结合我们的集合{1,7,5,8}
就是1 的下一个的下一个的上一个,(1的下一个是7,7的下一个是5,5的上一个是7)
如果还是不清楚,我们可以通过图例的方式仔细去看看双向链表怎么插入的,原文地址https://blog.csdn.net/wangzhen209/article/details/8180462
https://blog.csdn.net/wangzhen209/article/details/8180462

Remove方法

在这里插入图片描述
首先会执行node(index),这个方法其实就是获取删除元素的值,这里不再详解。
在这里插入图片描述

删除操作主要是unlink方法
在这里插入图片描述
笔者当初只看代码,也是不明就里,到底怎么删除的,怎么指向上一个位置,下一个位置。因为我陷入了常规的传值赋值里边了,最后得到都是null,怎么搞。(其实仔细看element,next,prev都是final修饰的)

后来我试着画了个草图
在这里插入图片描述
remove(2)也就是删除“5”
我把 每个节点的当前节点,上一个节点,下一个几点都画了出来,结果就一目了然了。
网上有一个细致的双链表讲解,感兴趣的童鞋可以去看看图示双链表

在这里插入图片描述

总结:经历了这番折腾之后,我们会知道LinkedList底层是双链表,插入删除的时候,只需要操作当前节点的前后两个节点,就可以,所以效率会很快,而ArrayList 底层是数组,插入删除操作都要通过System.arraycopy方法去复制获得ArrayList删除,(笔者其他文章有介绍ArrayList插入和删除)。

  • ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
  • 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
  • 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值