🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
LinkedList 源码分析(二)总结
正菜来了⛳⛳⛳
🎈LinkedList 中相关方法
🍮linkBefore(E e, Node<E> succ)
含义:这个函数对应的意思是在指定的节点 succ 之前插入 e 这个元素,从下边的函数中可以看出先欸 pred 赋值 succ 的前驱节点,然后创建一个新的节点,并指定前和后节点信息,并且如果 succ 原来是 first 节点,需要更新 first 指向新的 e 这个节点。
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++;
}
复制代码
🍮E unlinkFirst(Node<E> f)
含义:取消非空第一个节点 f 的链接,把 f 节点删除,并把 first 指向 f 节点的下一个节点。
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}
复制代码
🍮E unlinkLast(Node<E> l)
含义:取消非空的最后一个节点 l 的链接,把 l 节点删除,并把 l 前一个节点的 next 指向为 null。
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;
}
复制代码
🍮E unlink(Node<E> x)
含义:取消一个非空节点的链接,即把当前节点的前一个节点指向后一个节点,并返回当前节点的值。
E unlink(Node<E> x) {
// assert x != null;
final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;
if (prev == null) {
first = next;
} else {
prev.next = next;
x.prev = null;
}
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
x.item = null;
size--;
modCount++;
return element;
}
复制代码
🍮E getFirst()
含义:返回 LinkedList 链表中的第一个元素。
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
复制代码
🍮E getLast()
含义:返回 LinkedList 链表中的最后一个元素。
public E getLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return l.item;
}
复制代码
🍮E removeFirst()
含义:移除 LinkedList 链表中的第一个元素。
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
复制代码
上边的函数中调用了 unlinkFirst(f) 这个函数就是上边我们说到的把 f 这个头节点的元素删除,first 指向 f.next 元素。
🍮E removeLast()
含义:移除 LinkedList 链表中的最后一个元素。
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
复制代码
上边的函数中调用了 removeLast(f) 这个函数就是上边我们说到的把 f 这个尾节点的元素删除,last 指向 last.prev 元素。
🍮void addFirst(E e)
含义:在 linkedList 中的头节点处添加一个 e 节点。
public void addFirst(E e) {
linkFirst(e);
}
复制代码
🍮void addLast(E e)
含义:在 linkedList 中的尾节点处添加一个 e 节点。
public void addLast(E e) {
linkLast(e);
}
复制代码
🍚总结
以上为 LinkedList 的部分源码的总结,希望有所帮助。
评论