linklist

140 阅读1分钟

有序(输入和输出相同顺序),有下标,可重复,可以有多个null,线程不安全,元素的访问总是从头开始效率 低,但是元素的添加只是地址的内容更改,性能较快。

1.构造函数什么都不做

public LinkedList() {
}

2.添加元素,返回true

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

3.将原本的尾节点,保存到常量l,创建新节点,上一个节点为last也就是l内容未添加的元素,下一个节点是null。last 指向刚创建的新节点。判断last节点是否为空,为空则刚添加的是第一个节点first也指向刚刚节点。不是则让last原本 指向的节点(last变啦,但是原本节点位置在l内)指向新节点,这样就串联起来啦。

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

4.内部私有静态类,定义节点类型,每一个数据都打包为这种类型进行存储。

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

简而言之,初始化不做事情,因为是链表,每个元素的添加都是节点的创建与节点的串联。没有过多复杂的扩容,但是指针的赋值逻辑要谨慎。(链表没有下标,但是访问时从头到尾的依次访问,相当于下标的数字的增加,则为虚拟下标)