LinkedList添加删除方法源码学习

概述: LinkedList是List接口下的一个实现类,它的底层是用一个双向链表来实现元素的增删改查的。下面来分析LinkedList的add和remove方法。

首先介绍这个类里面的一些东西:

在这里插入图片描述
size:表示LinkedList中元素的个数。
first:表示链表的头结点,相当于一个指针。
last:表示链表的尾结点,相当于一个指针。
LinkedList():表示LinkedList的空参构造方法,可以看到里面没有任何代码,因为在生成一个LinkedList对象时,主要是使用这个:
在这里插入图片描述
这是一个内部类,相当于C语言所写的结构体,表示的是一个双向链表结点,添加一个元素或者删除一个元素都是对结点进行操作:在这里插入图片描述


下面进入到add方法中去:

在这里插入图片描述
方法中又调用了另外一个linkLast方法,这才是真正实现添加的方法。
在这里插入图片描述
第一步:它将尾结点last赋给一个新结点 l。

第二步:调用Node的构造方法生成一个新结点newNode,该结点存的数据就是本次添加元素e,并将prev指针指向l。

第三步:接着将newNode赋给Last,即last指针指向新结点

接下来是一个if判断,如果l == null,说明这是一个空链表,则执行 first = newNode,即first指针指向新结点。
如果l != null,则表示链表非空,执行 l.next = newNode,表示原来last指针指向的结点中的next指针指向新结点。

最后,size++表示元素个数加一,modCount++表示修改次数加一。


下面进入remove方法:

在这里插入图片描述
该方法也是调用另外一个removeFirst方法:
在这里插入图片描述

该方法会将first指向的头结点赋给一个f(可以猜到空参的remove方法是对头结点进行删除),同时对f进行判断,如果f为null,表示链表没有结点可删,抛一个异常;否则执行unlinkFirst方法:
在这里插入图片描述
第一步:取出头结点中的元素赋给element。
第二步:将头结点的next指针指向的下一个结点赋给新定义的结点next。
第三步,第四步:将头结点的item,next置为null,注释后面的help GC 表示这样会让GC认为这是一个垃圾并最后回收掉这个结点。
第五步:执行first = next,即将first指针指向已删除结点的下一个结点。
接下来会进行一个if判断:如果next == null 则表示链表中只有一个结点,刚被删除了,所以要将last也置为null。(first=next已经置为null了)。
如果if条件不成立,则表示链表不止一个结点,更新next.pev = null(结点已被删除了,所以指针指向空)
后面就是元素个数减1,修改次数加一。


总结:由于LinkedList底层是一个双向链表,所以在添加和删除元素时,效率会比List高(不一定),但访问一个元素时效率则比List低很多(数组和链表的优缺点)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值