【源码那些事】LinkedList底层源码有那么难吗,一文让你学会它

本文深入分析了LinkedList的数据结构及其实现原理,包括其继承体系、主要属性、构造方法、添加和删除元素的方法,并通过图示直观展示不同操作的时间复杂度。

⭐️写在前面


在这里插入图片描述

⭐️1 LinkedList的继承体系图

在这里插入图片描述

从继承体系上可以看到

- LinkedList实现了QueueDeque接口,所以他可以作为List来使用,也可以作为双端队列来使用,甚至可以作为
- 栈来使用
- LinkedList实现了CloneableSerializable接口,由此可得LinkedList可以被克隆与序列化

⭐️2 LinkedList源码分析

⭐️2.1 LinkedList的主要属性

//size:链表中元素的数量
transient int size = 0;
//first:链表中的头节点
transient Node<E> first;
//last:链表中的尾节点
 transient Node<E> last;

transient:

不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中
所以size,first,last均不会被序列化

在这里插入图片描述

⭐️2.2 LinkedList源码

⭐️2.2.1 LinkedList构造方法

无参构造

    public LinkedList() {
   
   
    }

有参构造

//传入Collection集合并把Collection集合中的元素添加到LinkedList集合中    
public LinkedList(Collection<? extends E> c) {
   
   
        this();
        addAll(c);
    }

    public boolean addAll(Collection<? extends E> c) 	{
   
   
        return addAll(size, c);
    }

    public boolean addAll(int index, Collection<? extends E> c) {
   
   
        //检查index是否越界
        checkPositionIndex(index);
		//将集合转成Object[]数组
        Object[] a = c.toArray();
        //获得数组长度,记录为numNew
        int numNew = a.length;
        //数组长度为0,则证明无可添加元素
        if (numNew == 0)
            return false;
		//pred为要拼接的集合的前驱节点指针,succ为要拼接集合的后继节点指针
        Node<E> pred, succ;
        //如果要插入位置的索引位于链表末尾
        if (index == size) {
   
   
            //集合c的后继为空
            succ = null;
            //集合c的前驱为原链表的尾节点
            pred = last;
        } else {
   
   
            //node(index)为index索引处的节点,要插入集合的后继指向它
            succ = node(index);
            //要插入集合的前驱节点指向index所处节点的前一个节点
            pred = succ.prev;
        }
		//开始插入
        for (Object o : a) {
   
   
            @SuppressWarnings("unchecked") E e = (E) o;
            //创建新节点,新节点的前驱指向index所处节点的前驱
            Node<E> newNode = new Node<>(pred, e, null);
            //如果为空则证明,要插入的节点位于链表的首部
            if (pred == null)
                //首指针指向新节点
                first = newNode;
            else
                //否则pred的后继指向新节点
                pred
评论 87
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温文艾尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值