1、LinkedList 的基本原理,底层是一个双向链表。优点主要是插入和删除元素性能好,确定是随机访问性能差,不是线程安全的。链表元素(node)具有 prev 和 next、item 组成,内部存在 first 和 last 两个头尾指针。
    2、在 LinkedList 的尾、头添加或者删除元素,使用 l 辅助指针记录原 last 元素或 first 指针位置。
    3、get、set、add、 remove方法会调用node方法进行定位元素,采用二分法思想,根据 size>>1 进行了二分,通过 for 循环定位元素,时间复杂度 O(n)
    4、中间添加或者删除元素时候,先定位元素,之后使用两个前后辅助指针,进行元素的插入或者删除。
    5、add和set的区别,set是替代目标位置,add 是在目标位置插入,并向右移动
    6、peek是查询出第一个,poll和remove是要进行删除,poll如果list为空则返回null,remove如果list为空则返回nosuchElementException异常
    7、linkList也适用fast-fail机制,get和set remove都要调用checkElementIndex
    8、jdk1.8 add不指定位置方法会直接在尾部插入一个元素,指定位置会向右移动,会根据要插入的位置 index 判断,是否向尾节点添加元素。如果是和上一节讲的普通 add(E e)方法一样,调用了 linkLast 方法而已。主要不同的是当不是向尾节点添加元素时,调用了 linkBefore 方法,linkBefore方法会传入参数和位置,linkBefore(element, node(index));
    9.linkLast 是通过辅助指针 l 指向 last,来帮助在结尾添加节点的。而 linkBefore 是通过,先定位元素后,用定位元素的 prev 前一个节点作为辅助,插入元素的。你只要记住这个思路,一定能自己手写出来两种 add 方法的。
    10.remove无参是直接断开第一个元素,断开头节点重置为null,如果remove 指定位置则通过 node 方法定位元素,之后使用了两个辅助指针,prev 和 next 分别记录了所定位元素的前后节点,通过二分法 + for 循环遍历查找而已。通过 prev 和 next 两个指针,就可以分别断开定位元素 x 的前后指针,并且 next 和 prev 重新相接,就实现了从某个位置删除元素了。
    11.removeLast 删除最后一个
    12.四个内部类:Node,ListItr,DescendingIterator,LLSpliterator