public LinkedList(Collection<? extends E> c):根据指定集合构造LinkedList。步骤为先构造一个空Linkedlist,再把指定集合中的所有元素都添加到LinkedList中
2.4 添加元素
add 方法实际上会调用 linkLast 方法,即在链表最后添加元素
publicbooleanadd(E e){linkLast(e);returntrue;}voidlinkLast(E e){// 使节点l指向原来的尾结点final Node<E> l = last;//新建节点newNode,节点的前指针指向l,后指针为nullfinal Node<E> newNode =newNode<>(l, e, null);// 尾指针指向新的头节点newNode
last = newNode;// 如果原来的尾结点为null,更新头指针,否则将原来尾结点的后指针指向新节点newNode,构成双向if(l == null)
first = newNode;else
l.next = newNode;
size++;
modCount++;}
2.5 get、set、remove
三者中都调用了 node(index) 方法,用于返回在指定索引处的非空元素
在查找时有一个优化点是:若 index 小于总长度的一半,则从头开始遍历;否则从尾开始遍历
Node<E>node(int index){// assert isElementIndex(index);if(index <(size >>1)){
Node<E> x = first;for(int i =0; i < index; i++)
x = x.next;return x;}else{
Node<E> x = last;for(int i = size -1; i > index; i--)
x = x.prev;return x;}}
get先检测范围,然后找到指定元素
public E get(int index){checkElementIndex(index);returnnode(index).item;}
set先检测范围,然后找到指定元素替换,并返回旧值
public E set(int index, E element){checkElementIndex(index);
Node<E> x =node(index);
E oldVal = x.item;
x.item = element;return oldVal;}
remove先检测范围,然后找到指定元素更新连接,并返回旧值
public E remove(int index){checkElementIndex(index);returnunlink(node(index));}
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;}
public E poll(){final Node<E> f = first;return(f == null)? null :unlinkFirst(f);}public E remove(){returnremoveFirst();}public E removeFirst(){final Node<E> f = first;if(f == null)thrownewNoSuchElementException();returnunlinkFirst(f);}
获取头部元素:element 和 peek,两者最终都是访问 f.item,但是两者的区别为:
方法
操作失败时的处理方式
element
若头部元素为空会抛出NoSuchElementException
peek
不抛出异常,只是返回 null
public E peek(){final Node<E> f = first;return(f == null)? null : f.item;}public E element(){returngetFirst();}public E getFirst(){final Node<E> f = first;if(f == null)thrownewNoSuchElementException();return f.item;}
2.7 栈操作(入栈、出栈、获取栈顶)
具体实现方式和队列类似,当利用LinkedList实现栈时使用
publicvoidpush(E e){addFirst(e);}public E pop(){returnremoveFirst();}public E peek(){final Node<E> f = first;return(f == null)? null : f.item;}