在表頭插入和刪除速度很快,僅需改變一兩個引用值,所以花費 O(1) 的時間。
平均起來,查找、刪除和在指定節點後面插入都需要搜索鏈表中的一半節點,需要O(N)次比較。
在數組中執行這些操作也需要 O(N) 次比較,但是鏈表仍然要比數組快一些,因爲當插入和刪除節點時,鏈表不需要移動任何東西,
增加的效率是很顯著的,特別是當複製時間遠遠大於比較時間的時候。
當然,鏈表比數組優越的另一個重要方面是鏈表需要多少內存就可以用多少內存,並且可以擴展到所有可用內存。
數組的大小在它創建的時候就固定了,所以經常由於數組太大導致效率低下,或者數組太小導致空間溢出。可變數組可以解決這個問題,
但是它經常只允許以固定大小的增量擴展,這個解決方案在內存使用率上來說還是比鏈表要低。
LinkedList 不需要擴容
Node {
previous,
next,
E item
}
LinkedList {
Node firstNode;
Node lastNode;
int size;
// add to the last
public boolean add(E e) {
Node node = new Node(e, lastNode, null);
lastNode.next = node;
size++;
return true;
}
// remove the head
public E remove() {
Node next = firstNode.next;
firstNode == null;
if (next == null) {
last = null;
} else {
next.previous = null;
}
this.first = next;
return firstNode.item;
size --;
}
}