LInkedList继承自抽象顺序列表,间接继承AbstractList,实现了List、Deque、Cloneable、Serializable接口。LInkedList是一个双向链表。
因为采用的是链表结构,在每次添加元素时都会创建新的Node节点,所以不存在扩容操作
transient int size = 0;表示元素个数
transient Node<E> first;表示链表头节点
transient Node<E> last;表示链表尾节点
类中的添加方法:add(),addLast()在内部都是调用了LInkedLast()方法,addFirst在内部调用LInkedFirst方法:增加头结点
首先其创建了一个新的结点,其的后继为原来的头结点。
判断原来的链表是否为空,Last和First都为null,所以要设置Last为新的结点。如果不为空,就可以正常赋值前驱结点。添加成功后修改元素个数。
LInkLast()方法:添加尾结点:
首先定义一个新的结点,前驱为原来的尾结点。同上述一样,也需要判断原来的链表是否为空。
getFirst()方法:查找第一个元素。
首先定义一个结点让他等于当前的头结点,然后进行判断原来的链表是否为空,如果为空就抛出NoSuchElementException异常;如果不为空就返回当前头结点的元素内容。
getLast()方法:查询最后一个元素。
就是把定义的结点等于当前的尾结点,其他与上述过程相同。
get()方法:返回指定下标位置的元素。
链表没有索引,所以把第一个元素的头结点的位置看做为0;以此类推。首先判断index在链表的前半部分还是后半部分,然后通过for循环遍历查找。
remove()方法中调用的是removeFirst()方法。
removeFirst():删除;链表中的第头元素
首先删除原来的链表是否为空,不为空,则返回调用unlinkFirst()方法的结果。
unlinkFirst():调用这个方法时,已经确定过原来的链表不为空,所以先是把相应的引用设为 null,接着设置新头节点为 next,若 next 为空,说明链表已经空了,设置 last,否则,将 next 前驱设置为空,更新 size 和 modCount 。
removeLast()方法:删除链表中的尾元素
同样的,在调用时已经确定过原来的链表不为空,然后引用设为 null,设置新尾节点,更新元素个数。