Java集合之LinkedList源码

Java集合之LinkedList源码

Doubly-linked list implementation of the {@code List} and {@code Deque} interfaces. Implements all optional list operations, and permits all elements (including {@code null}) ———— java注解

LinkedList是一个双向链表,它实现了List和Deque(双端队列)接口。都有一个previous和next, 链表最开始的部分都有一个fiest和last 指向第一个元素,和最后一个元素。

public class LinkedList<E> extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;

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

    /**
     * Pointer to last node.
     */
    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想象成一列车厢号打乱的火车吧,Node 就是每节车厢用于存储数据。既然是车厢那么就有连接前后车厢的挂钩,而prev,和next就是这个挂钩。增加和删除的时候,只需要更改一个prev和next,就可以实现增加和删除,所以说,LinkedList对于数据的删除和增加相当的方便。但在查找时,好比你就是列车长,从列车的车头(first)走到目标车厢,但车厢是打乱的,所以你只能从你所在车厢的车门知道下一节车厢是哪个。。。。。。。。。。灵魂画手来了

在这里插入图片描述

next指向了Node的地址,而pre指向了Frist的地址。这就双向的意思了,车长在First车厢,看着挂钩next就知道下节的车厢号了。车长在First里看着pre为Null,就这知道这节车厢是车头了。现在就两节车厢,所以Node车厢也就是车尾了即last。

怎么网Node车厢后面再加一节呢?即LinkedList#add(E e)方法,而它再调用linkLast(E e);

/**
 * Links e as last element.
 */
 void linkLast(E e) {
    final Node<E> l = last;  // 取到last,车尾 。l为旧的车尾
    // 加入新车厢pre为 l 旧车尾的地址。因为newNode是新的last车尾,所以newNode的next = null
    final Node<E> newNode = new Node<>(l, e, null); 
    // 更新LinedList的last
    last = newNode;
    if (l == null)  // 则原本就没有车厢, newNode新车厢就是车头了。
        first = newNode;
    else           // 之前有车厢, 将旧的车厢的next 指向新车尾的地址
        l.next = newNode;
    size++;
    modCount++;
 }
    l.next = newNode;
size++;
modCount++;

}

// TODO

发布了19 篇原创文章 · 获赞 1 · 访问量 289

猜你喜欢

转载自blog.csdn.net/XSemperFI/article/details/96353499