概述
LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。
LinkedList实现
数据结构
LinkedList底层通过双向链表实现,LinkedList通过 first 和 last 引用分别指向链表的第一个和最后一个元素。当链表为空的时候first和last都指向null。
transient int size = 0;
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
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;
}
}
具体方法
List 类方法
add(E e) : 在末尾插入元素,因为有last指向链表末尾,在末尾插入元素的花费是常数时间
add(int index, E element) : 先查找位置在插入(可以从head或tail节点开始找,那个快用那个)
E get(int index)
E set(int index, E element)
E remove(int index)
int indexOf(Object o) : 第一次出现的位置
int lastIndexOf(Object o) : 最后一次出现的位置
Queue 方法
# 如果LinkedList为空则返回 null
E peek() :获取第一个元素
E poll() :获取并删除第一个元素
# 如果LinkedList为空则抛出异常
E element() :获取第一个元素
E remove() : 获取并删除第一个元素
offer(E e) :在末尾添加元素
Deque 方法
offerFirst(E e) :在头部添加
offerLast(E e) :在尾部添加
E peekFirst() :获取第一个
E peekLast() :获取最后一个
E pollFirst() :获取并删除第一个元素
E pollLast() :获取并删除最后一个元素
push(E e) :在头部添加
E pop() :删除末尾
# 从头向尾部遍历
boolean removeFirstOccurrence(Object o) :删除第一次出现的指定元素
boolean removeLastOccurrence(Object o) :删除最后一次出现的指定元素