小小小幸运 发表于 2023-11-30 17:01:46

详解Java LinkedList

LinkedList简介

LinkedList是List接口的实现类,基于双向链表实现,继承自AbstractSequentialList类,同时也实现了Cloneable、Serializable接口。此外还实现了Queue和Deque接口,可以作为队列或双端队列使用。
https://img2023.cnblogs.com/blog/1669883/202311/1669883-20231101135439274-1399626466.png
LinkedList的插入删除时间复杂度:

[*]在头部或尾部插入删除元素,只需要修改头节点或尾节点的指针即可完成,时间复杂度为O(1);
[*]在其他位置插入删除元素,需要遍历到指定位置,再修改指定节点的指针,平均要移动n/2个位置,时间复杂度为O(n)。
LinkedList没有像ArrayList有RandomAccess接口的标记,因为LinkedList基于链表实现,链表节点之间的内存地址不连续,只能通过指针来定位,因此无法实现快速随机访问。
常用方法

public class LinkedListTest {
    public static void main(String[] args) {
      LinkedList<Integer> linkedList = new LinkedList<>();
                //添加元素
      linkedList.add(2);
      linkedList.addFirst(1);
      linkedList.add(3);
      linkedList.add(4);
      linkedList.addLast(5);
                //获取元素
      System.out.println(linkedList.get(1));
      System.out.println(linkedList.getFirst());
      System.out.println(linkedList.getLast());
                //创建双端队列
      Deque<String> deque = new LinkedList<>();
                //元素入队
      deque.offer("a");
      deque.offer("b");
      deque.offer("c");
                //获取队头元素,但不删除队头元素
      System.out.println(deque.peek());
                //元素出队
      String a = deque.poll();
      System.out.println(a);
    }
}LinkedList核心源码分析

下面以JDK17的LinkedList代码进行分析。
类属性

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

    //首节点
    transient Node<E> first;

    //尾节点
    transient Node<E> last;
}LinkedList中的节点由Node定义:
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;
        }
}构造方法

//创建一个空链表对象public LinkedList() {}//传入一个集合,将集合中的元素存入链表public LinkedList(Collection
页: [1]
查看完整版本: 详解Java LinkedList