写点什么

LinkedList 源码分析 - 新增

作者:zarmnosaj
  • 2022 年 5 月 19 日
  • 本文字数:1113 字

    阅读完需:约 4 分钟

LinkedList 源码分析-新增

新增节点时,我们可以选择从链表头部新增,或者是从链表尾部新增;add 方法默认是从尾部新增,addFirst 方法是从头部新增。

新增数据(尾部新增)

从尾部追加(add)


    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++;    }
复制代码


  1. final Node<E> l = last;把尾节点数据暂存到局部变量

  2. final Node<E> newNode = new Node<>(l, e, null);新建新的节点(l 是新节点的前一个节点,当前值是尾节点值,e 表示当前新增节点,当前新增节点后一个节点是 null)

  3. last = newNode;新建节点追加到尾部

  4. if (l == null) 如果链表为空(l 是尾节点,尾节点为空,链表即空),头部和尾部是同一个节点,都是新建的节点

  5. size++;modCount++; 大小和版本更改

新增数据(头部新增)

从头部追加(linkFirst)


    private void linkFirst(E e) {        final Node<E> f = first;        final Node<E> newNode = new Node<>(null, e, f);        first = newNode;        if (f == null)            last = newNode;        else            f.prev = newNode;        size++;        modCount++;    }
复制代码


  1. final Node<E> f = first; 头节点赋值给临时变量

  2. final Node<E> newNode = new Node<>(null, e, f);新建节点,前一个节点指向 null,e 是新建节点,f 是新建节点的下一个节点,目前值是头节点的值

  3. first = newNode;新建节点成为头节点

  4. if (f == null)头节点为空,就是链表为空,头尾节点是一个节点头部追加节点和尾部追加节点非常类似,只是前者是移动头节点的 prev 指向,后者是移动尾节点的 next 指向。

  5. size++;modCount++; 大小和版本更改

指定元素前新增

从指定元素前新增(linkBefore)


    void linkBefore(E e, Node<E> succ) {        // assert succ != null;        final Node<E> pred = succ.prev;        final Node<E> newNode = new Node<>(pred, e, succ);        succ.prev = newNode;        if (pred == null)            first = newNode;        else            pred.next = newNode;        size++;        modCount++;    }
复制代码


  1. E e, Node<E> succ表示即将插入的元素以及指定位置的元素

  2. final Node<E> pred = succ.prev;将指定元素的上一个元素保存

  3. new Node<>(pred, e, succ);创建即将插入的元素对象

  4. succ.prev = newNode;更新 succ 的指向新插入的 Node 对象

  5. 更新新插入 Node 对象的上一个 Node 对象的指向

  6. size++; modCount++; 大小和版本更改

用户头像

zarmnosaj

关注

还未添加个人签名 2020.02.06 加入

还未添加个人简介

评论

发布
暂无评论
LinkedList 源码分析-新增_5 月月更_zarmnosaj_InfoQ写作社区