概述: 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,修改次数加一。