概念:链表是链式存储的表,是一种非连续非顺序的存储结构,数据元素是通过链表中的指针/地址链式存储起来的。
特点:查找慢,增删快。
删除元素
这里要注意两个特殊情况,一个是删除的头节点,一个是删除的是尾节点
(1)如果x的 前一个结点为null,说明x的原为头节点,新头节点应该为x的后一个结点 (2)如果x的 后一个结点为null,说明x的原为尾节点,新尾节点应该为x的前一个结点
具体代码实现会在下面一点讲哦
//内部通用方法 - 将指定节点脱离
private E unlink(Node<E> x) {
//1.定义变量 记录x结点数据、x的前一个结点、x的后一个结点
final E element = x.item;//储存元素信息
final Node<E> next = x.next;
final Node<E> prev = x.prev;
//2.处理x的前一个结点相关数据
//(1)如果x的 前一个结点为null,说明x的原为头节点,新头节点应该为x的后一个结点
//(2)如果x的 后一个结点为null,说明x的原为尾节点,新尾节点应该为x的前一个结点
if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
//3.有利于垃圾回收
x.item = null;
return element;
}
LinkedList里可以有null元素,删除null元素时,只会删除第一个null
但是,在工程上为了提高效率一般都会将删除头节点和删除尾节点的操作单独拎出来来做
删除头节点
//内部通用方法 - 将第一个节点脱离
private E unlinkFirst(Node<E> f) {
//1.定义变量记录f的数据、f的下一个元素
E element=f.item;
Node<E> next=f.next;
//2.将first置为f的下一个
//若f的下一个为null,则证明当前集合只有一个元素,则应将last也置为null
f.item=null;
f.next=null;//对代码的实现无影响,但是可以帮助GC (垃圾回收)
first=next;
if(next==null){
last=null;
}else{
next.prev=null;
}
return element;
}
对于垃圾回收机制,大家可去参考其他文档。
删除尾结点
//内部通用方法 - 将最后一个节点脱离
private E unlinkLast(Node<E> l) {
E element=l.item;
Node<E> prev=l.prev;
l.item=null;
l.prev=null;//帮助 GC
//将last置为l的上一个
//若l的上一个为null,则证明当前集合只有一个元素,则应将first也置为null
last=prev;
if(prev==null){
first=null;
}else {
prev.next=null;
}
return element;
}