Node<E>node(intindex){
//assertisElementIndex(index);
if(index<(size>>1)){
Node<E>x=first;
for(inti=0;i<index;i++)
x=x.next;
returnx;
}else{
Node<E>x=last;
for(inti=size-1;i>index;i--)
x=x.prev;
returnx;
}
}

  通过这个方法获取到了插入节点的位置,并且将这个节点的前一个指针指向我们的元素节点pred;后开始了插入数组的过程。通过循环遍历这个数组不但的将数组的值插入到我们需要的位置,并且不断的更新链表的大小size属性。
  b:get(int)
  public E get(int index) {
  checkElementIndex(index);
  return node(index).item;
  }
  private void checkElementIndex(int index) {
  if (!isElementIndex(index))
  throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  }
  获取某一个索引的对象的方法很简单首先判断索引是否越界合法,然后根据node()函数返回节点及其对应的值。
  c:set(int,E)
  public E set(int index, E element) {
  checkElementIndex(index);
  Node<E> x = node(index);
  E oldVal = x.item;
  x.item = element;
  return oldVal;
  }
  重置某一个节点的值,这个实现也很简单,是首先检查索引是否越界合法,然后更加node()函数获取这个节点,然后更新这个节点对应的值即可。
  d:add(int,E)

 

public void add(int index, E element) {
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
private void checkPositionIndex(int index) {
if (!isPositionIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
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++;
}
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}

  在链表的某一个节点增加一个新的节点的实现方法:首先检查输入的下标索引是否合法,然后通过判断是添加到链表的尾部还是链表的中部,如果是尾部的话要调用linkLast(E)方法,如果是链表的中部要使用 linkBefore(element, node(index));方法。
  linkLast(E):直接插入到链表尾部修改一下链表尾部的指针即可还需要更新链表的长度。
  linkBefore(E e, Node<E> succ):将一个节点插入到一个非空的元素前面,如果插入的是头结点位置还需要修改头节点的指针,不然的话不需要更新头节点的指针。不然的话既需要修改该索引处的节点的前一个节点指向当前待插入元素,并且使索引处的前一个节点指针为当前带插入的元素。注意后修了改链表的长度。
  e:emove(int)