publicvoidadd(int index, E element){//1.位置校验,就是判断是否在0和size之间checkPositionIndex(index);//2.如果是最后的位置,就加在尾部if(index == size)linkLast(element);//3.不是最后的位置,就插在指定元素之前,node方法会定位index的元素elselinkBefore(element,node(index));}
linkBefore:链接在指定元素前面,修改双向指针即可
voidlinkBefore(E e, Node<E> succ){final Node<E> pred = succ.prev;//1.构建新节点,指定前驱后继final Node<E> newNode =newNode<>(pred, e, succ);//2.succ的前驱指向新节点
succ.prev = newNode;//3.设置新节点的前驱,如果原来的前驱是null,那么自己就是链表头结点if(pred == null)
first = newNode;else
pred.next = newNode;
size++;
modCount++;}
linkLast:链接在尾部
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
public E remove(int index){checkElementIndex(index);returnunlink(node(index));}
3.2.2 头尾移除
removeFirst头部移除
public E removeFirst(){final Node<E> f = first;if(f == null)thrownewNoSuchElementException();returnunlinkFirst(f);}
3.2.3 尾部移除
public E removeLast(){final Node<E> l = last;if(l == null)thrownewNoSuchElementException();returnunlinkLast(l);}
3.2.4 移除指定值
只能暴力查询,然后移除,复杂度O(N)
publicbooleanremove(Object o){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;}
3.3 修改元素
先定位,再修改,返回旧值
public E set(int index, E element){checkElementIndex(index);
Node<E> x =node(index);
E oldVal = x.item;
x.item = element;return oldVal;}
public E get(int index){checkElementIndex(index);returnnode(index).item;}
Node<E>node(int index){// assert isElementIndex(index);if(index <(size >>1)){
Node<E> x = first;for(int i =0; i < index; i++)
x = x.next;return x;}else{
Node<E> x = last;for(int i = size -1; i > index; i--)
x = x.prev;return x;}}
3.4.2 头部获取
public E getFirst(){final Node<E> f = first;if(f == null)thrownewNoSuchElementException();return f.item;}
3.4.3 尾部获取
public E getLast(){final Node<E> l = last;if(l == null)thrownewNoSuchElementException();return l.item;}
3.4.4 根据值获取
根据值查询,只能暴力查询,然后移除,复杂度O(N)
publicintindexOf(Object o){int index =0;if(o == null){for(Node<E> x = first; x != null; x = x.next){if(x.item == null)return index;
index++;}}else{for(Node<E> x = first; x != null; x = x.next){if(o.equals(x.item))return index;
index++;}}return-1;}