深入LinkedList的实现(三)--删除元素(上)

254 阅读2分钟

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

前言

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

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

摘要

本文主要深入删除链表所有节点元素和删除最后一个元素的实现。

删除元素

删除所有元素

clear()

voidclear() 从此列表中移除所有元素。
 public void clear() {
     for (Node<E> x = first; x != null; ) {
         Node<E> next = x.next;
         x.item = null;
         x.next = null;
         x.prev = null;
         x = next;
     }
     first = last = null;
     size = 0;
     modCount++;
 }

源码还是很好理解的,就是把所有的节点从first节点开始,遍历一遍,把所有的节点置为空,最后再把first和last置为空,把长度size置为0,修改次数+1.

删除最后一个元素

pollLast()

EpollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null
 public E pollLast() {
     final Node<E> l = last;
     return (l == null) ? null : unlinkLast(l);
 }

观察源码不难发现如果链表为空则返回null,否则调用unlinkLast()方法。同样这里我们也需要记住这个方法,删除最后一个元素实际上就是调用unlinkLast方法。下面我们就来看看unlinkLast()方法是如何实现的。

 private E unlinkLast(Node<E> l) {
     // assert l == last && l != null;
     final E element = l.item;
     final Node<E> prev = l.prev;
     l.item = null;
     l.prev = null; // help GC
     last = prev;
     if (prev == null)
         first = null;
     else
         prev.next = null;
     size--;
     modCount++;
     return element;
 }

原理就是把last指向最后一个节点的前一个节点,然后把最后一个节点置为null,如果前一个结点是null说明只有一个节点,此时已经把仅有的节点删除了,链表已经为空,所以把first置为null,否者就把前一个节点的后面节点置为null,最后把长度size减1,修改次数加1,返回删除节点的值。

removeLast()

EremoveLast() 移除并返回此列表的最后一个元素。
 public E removeLast() {
     final Node<E> l = last;
     if (l == null)
         throw new NoSuchElementException();
     return unlinkLast(l);
 }

如果链表为空就抛出异常,否则就调用unlinkLast方法。上面也已经介绍过了这个方法,删除最后一个节点就使用unlinkLast方法。比如pollLast方法。

总结

pollLast(),removeLast()方法实际上是一样的,都是调用unlinkLast()方法。下篇我们来学习删除第一个元素,欢迎掘友们互相关注。

以上就是我对删除元素的一些浅见,如有错误之处,欢迎掘友们批评指正。