属性和接口 
LinkedList 是双向链表,可通过头和尾节点遍历查询指定的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public  class  LinkedList <E> extends  AbstractSequentialList <E>     implements  List <E>, Deque<E>, Cloneable, java.io.Serializable {               transient  int  size  =  0 ;          transient  Node<E> first;          transient  Node<E> last;          private  static  class  Node <E> {                  E item;                  Node<E> next;                  Node<E> prev;                  Node(Node<E> prev, E element, Node<E> next) {             this .item = element;             this .next = next;             this .prev = prev;         }     } } 
 
LinkedList 为什么不能实现 RandomAccess 接口? 
RandomAccess 是一个标记接口,用来表明实现该接口的类支持随机访问(即可以通过索引快速访问元素)。由于 LinkedList 底层数据结构是链表,内存地址不连续,只能通过指针来定位,不支持随机快速访问,所以不能实现 RandomAccess 接口。
构造方法 
1 2 3 4 5 6 7 public  LinkedList ()  {} public  LinkedList (Collection<? extends E> c)  {    this ();     addAll(c); } 
 
传入集合时,会调用 addAll 方法初始化链表信息
插入 
从头部或尾部插入元素 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public  boolean  add (E e)  {    linkLast(e);     return  true ; } 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  void  addFirst (E e)  {    linkFirst(e); } private  void  linkFirst (E e)  {    final  Node<E> f = first;     final  Node<E> newNode = new  Node <>(null , e, f);     first = newNode;     if  (f == null )         last = newNode;     else          f.prev = newNode;     size++;     modCount++; } public  void  addLast (E e)  {    linkLast(e); } 
 
从指定位置插入元素 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 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)); } private  boolean  isPositionIndex (int  index)  {    return  index >= 0  && index <= size; } void  linkBefore (E e, Node<E> succ)  {         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++; } Node<E> node (int  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;     } } 
 
查找 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public  E get (int  index)  {         checkElementIndex(index);     return  node(index).item; } private  void  checkElementIndex (int  index)  {    if  (!isElementIndex(index))         throw  new  IndexOutOfBoundsException (outOfBoundsMsg(index)); } private  boolean  isElementIndex (int  index)  {    return  index >= 0  && index < size; } 
 
删除 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public  E remove (int  index)  {         checkElementIndex(index);     return  unlink(node(index)); } E unlink (Node<E> x)  {     final  E  element  =  x.item;     final  Node<E> next = x.next;     final  Node<E> prev = x.prev;          if  (prev == null ) {         first = next;     } else  {         prev.next = next;         x.prev = null ;     }          if  (next == null ) {         last = prev;     } else  {         next.prev = prev;         x.next = null ;     }     x.item = null ;     size--;     modCount++;     return  element; }