publicinterfaceList<E>extendsCollection<E>{...// 增booleanadd(E e);voidadd(int index, E element);// 删booleanremove(Object o);
E remove(int index);// 改
E set(int index, E element);// 查
E get(int index);...}
在上述接口中,我只抽取了比较重要的几个方法,然后以此为后续重点分析目标,其 List 接口对应的源码中远不止上述几个方法,有兴趣的同学可以自行翻阅。
publicclassLinkedList<E>extendsAbstractSequentialList<E>implementsList<E>, Deque<E>, Cloneable, java.io.Serializable{...*** 删除索引为 index 的元素并返回
**@param index 要删除的索引
* @return 返回删除的元素
* @throws IndexOutOfBoundsException 抛出索引角标越界异常
*/public E remove(int index){// 判断 index 是否合法,不合法则抛出索引越界异常checkElementIndex(index);returnunlink(node(index));}/**
* 删除元素 o,并且返回是否有效删除
*
* @param o 元素将从此列表中删除(如果存在)
* @return 如果存在该元素将其删除并返回 true,否则返回 false
*/publicbooleanremove(Object o){// 这里把空和非空进行区分,空的话用“==”判断,非空用“equals”判断if(o == null){// 从头节点开始遍历检索for(Node<E> x = first; x != null; x = x.next){if(x.item == null){// 获取当前要删除的节点,并将其传入unlink(x);returntrue;}}}else{// 从头节点开始遍历检索for(Node<E> x = first; x != null; x = x.next){if(o.equals(x.item)){// 获取当前要删除的节点,并将其传入unlink(x);returntrue;}}}returnfalse;}/**
* 断开非空节点 x 的链接
*/
E unlink(Node<E> x){// 获取当前节点的元素final E element = x.item;// 获取当前节点的下一个节点final Node<E> next = x.next;// 获取当前节点的上一个节点final Node<E> prev = x.prev;// 判断当前节点的上一个节点是否为 null,如果为 null 则代表 x 是头结点if(prev == null){
first = next;}else{
prev.next = next;
x.prev = null;}// 判断当前节点的下一个节点是否为 null,如果为 null则代表 x 是尾结点if(next == null){
last = prev;}else{
next.prev = prev;
x.next = null;}// 将节点 x 置空
x.item = null;// 维护 size
size--;// 用来记录 LinkedList 结构性变化的次数
modCount++;return element;}...}
3.7、改
LinkedList 的改操作有一种实现,对应的是 set(int index, E element),下面我们来分析这种实现。
publicclassLinkedList<E>extendsAbstractSequentialList<E>implementsList<E>, Deque<E>, Cloneable, java.io.Serializable{.../**
* 修改索引角标为 index 的元素值
*
* @param index 要修改的索引坐标
* @param element 修改后存储的元素值
* @return 返回修改前的元素值
* @throws IndexOutOfBoundsException 抛出索引角标越界异常
*/public E set(int index, E element){// 判断 index 是否合法,不合法则抛出索引越界异常checkElementIndex(index);// 获取索引为 index 的节点
Node<E> x =node(index);// 获取节点 x 的值
E oldVal = x.item;// 将元素 element 赋值给节点 x 的 item
x.item = element;// 返回原本节点 x 的值return oldVal;}...}