jdk源码阅读笔记-LinkedList

 

一、LinkedList概述

  LinkedList的底层数据结构为双向链表结构,与ArrayList相同的是LinkedList也可以存储相同或null的元素。相对于ArrayList来说,LinkedList的插入与删除的速度更快,时间复杂度为O(1),查找的速度就相对比较慢了,因为每次遍历的时候都必须从链表的头部或者链表的尾部开始遍历,时间复杂度为O(n/2)。为了实现快速插入或删除数据,LinkedList在每个节点都维护了一个前继节点和一个后续节点,这是一种典型的以时间换空间的思想。LinkedList同时也可以实现栈与队列的功能。

  二、LinkedList的结构图

  在LinkedList中每个节点有会有两个指针,一个指向前一个节点,另一个指向下一个节点。链表的头部的前指针为null,尾部的后指针也为null,因此也可以说明LinkedList(基于jdk1.8)是非循环双向链表结构。源码如下:

复制代码
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属性

  1、size: 链表的长度

  2、first:链表的第一个节点

  3、last:链表的最后一个节点

复制代码
transient int size = 0;      /**      * Pointer to first node.      * Invariant: (first == null && last == null) ||      *            (first.prev == null && first.item != null)      */     transient Node<E> first;      /**      * Pointer to last node.      * Invariant: (first == null && last == null) ||      *            (last.next == null && last.item != null)      */     transient Node<E> last;      /**      * Constructs an empty list.      */
复制代码

 

  四、添加节点

  1、链表头部添加新节点

复制代码
/**      * Links e as first element.      *  链接头部      */    private void linkFirst(E e) {         //链表的第一个节点        final Node<E> f = first;         //创建节点        final Node<E> newNode = new Node<>(null, e, f);         //将新创建的节点放到链条头部        first = newNode;         //当链表为null时,链表头部和尾部都指向新节点        if (f == null)             last = newNode;         else             f.prev = newNode;//
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信