LinkedList

LinkedList 是由一组元素串联而成的序列结构

链表是以Node对象为基础定义的一种序列结构

Node 结构中定义了它的前一个和后一个元素,这样每一个元素都可以通过next和prev 查找到前一个元素和后一个元素

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 初始化定义了 链表长度,头节点和尾节点

    transient int size = 0;

    /**
     * Pointer to first node.
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     */
    transient Node<E> last;

构造器 有两个

空参构造器:

    public LinkedList() {
    }

将Collection集合元素添加成列表

    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }

add (E e)

像链表末尾添加元素

public boolean add(E e) {
        linkLast(e);
        return true;
    }

直接向链表末尾添加元素,对象存储的last 节点 被设置为新的node,将原有的last的next设置为新的node。判断first 是否有值,如果没有将node同样赋值给first (意味着当前链表中仅有node一个元素),

    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++;
    }

add (int index , E element)

向指定位置添加元素,如果位置在链表末尾,则使用linklast 如果位置非末尾,使用linkbefore

    public void add(int index, E element) {
        checkPositionIndex(index);

        if (index == size)
            linkLast(element);
        else
            linkBefore(element, node(index));
    }

将当前位置的元素的前一项指向新元素,将当前位置元素前一项元素的下一项指向新元素

    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++;
    }