小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
每天一小步,成功一大步。大家好,我是程序猿小白 gw_GW,很高兴能和大家一起学习每天小知识。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要深入删除链表所有节点元素和删除最后一个元素的实现。
删除元素
删除所有元素
clear()
| void | clear() 从此列表中移除所有元素。 |
|---|
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()
E | pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 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()
E | removeLast() 移除并返回此列表的最后一个元素。 |
|---|
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
如果链表为空就抛出异常,否则就调用unlinkLast方法。上面也已经介绍过了这个方法,删除最后一个节点就使用unlinkLast方法。比如pollLast方法。
总结
pollLast(),removeLast()方法实际上是一样的,都是调用unlinkLast()方法。下篇我们来学习删除第一个元素,欢迎掘友们互相关注。
以上就是我对删除元素的一些浅见,如有错误之处,欢迎掘友们批评指正。