LinkedList底層的實現基於雙向表
prev | data | next |
next指向下一個node的地址。prev指向上一個node。
這里的代碼是LinkedList類的源碼。
private static class Node<E> {
//業務數據 E item;
//指向下個node Node<E> next;
//指向上個node Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
那么當我們是用list.add(e);方法時會添加到這個鏈表的末位
public boolean add(E e) { linkLast(e); return true; }
那么鏈表的首尾node的prev和next,看實現代碼
也就是說,firstnode的prev和lastNode的next為null
private void linkFirst(E e) { //這里首先獲得firstNode final Node<E> f = first; //這里的新的Node final Node<E> newNode = new Node<>(null, e, f); //此node成為新的firstNode first = newNode; //如果原來firstNode為空的話,說明這個list為空,那么這時FirstNode也就是lastNode,這個鏈表只有一個node if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; } /** * Links e as last element.代碼解釋如上。 */ void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }