深入LinkedList的实现(二)--add()方法

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

每天一小步,成功一大步。大家好,我是程序猿小白 gw_GW,很高兴能和大家一起学习每天小知识。
复制代码

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要讲述LinkedList的add方法实现原理,通过分析源码带领读者走进add方法。
复制代码

add方法

LinkedList通过add方法来实现添加元素,那add方法到底是如何实现的呢?

来看源码:

 public boolean add(E e) {
     linkLast(e);
     return true;
 }
复制代码

官方对add方法的解释是:

将指定的元素追加到列表的末尾。 这个方法等价于addLast。 参数: 附加到这个列表中的元素 返回: true(由Collection.add指定)

其实我们看到他的返回结果会一直是true,这时有人要质疑了,add方法中不是还调用了linkLast方法吗,那我们就来看一下linkLast方法是如何实现的。

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

linkLast是一个void方法,所以add方法无论是否正确插入都会返回true,那什么情况下会发生错误呢?就是你添加的对象太多了,以至于存储不下,这种情况基本是不会遇到的,所以大家不需要担心。

在我们分析linkLast方法之前,首先来看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;
     }
 }
复制代码

Node类是LinkedList中的一个静态内部类。里面含有三个成员变量和一个构造方法。

  • item 表示E类型的对象
  • next 表示指向当前节点的下一个节点的指针
  • prev 表示指向当前节点的前一个节点的指针
  • 构造方法用来构造当前节点。

其实Node类就相当于C语言中的struct Node。

知道了Node类是什么之后我们就可以更容易理解LinkedList的实现,下面我们接着来分析LinkedList。

 last 指向链表的最后一个节点。
 首先创建一个Node类型的对象,赋值为last,即创建一个Node类型的对象指向当前链表的最后一个节点,
 然后创建一个新节点,并让新节点称为最后一个节点。
 接着判断未添加该节点之前链表的结尾是否为空,如果为空则为空链表,把新节点作为第一个节点。
 否者就把新节点添加为最后一个节点的下一个节点。
 最后将链表的长度加1,修改次数加1.
复制代码

结语

以上就是我对add方法的一些浅见,如有不正之处,欢迎掘友们批评指正!

猜你喜欢

转载自juejin.im/post/7016686489484558367