積千里跬步,匯萬里江河;天天進步一點點,終有一天將成大佬。java
本文基於JDK1.8node
LinkedList
因爲實現了Deque
這個接口,因此能夠當棧
和隊列
使用。不過通常要用棧
或隊列
的時候推薦使用ArrayDeque
,因此這裏就不講LinkedList
的棧和隊列功能了🌚。仍是和上篇ArrayList同樣,講些經常使用的方法。web
LinkedList
內部是由雙鏈表組成的,裏面存放着一個個Node
,每一個Node
又包含三個元素(prev
,item
,next
):算法
Node
Node
鏈表的第一個
Node
的prev
爲null
,最後個Node
的next
爲null
app
我簡單的畫了一張圖,能夠看下源碼分析
這個prev和next並非指向null,由於內存中沒有爲null分配空間,這邊是表示是prev和next爲null;ui
相比於Arraylist
,LinkedList
內部變量就少得多,就只有三個,size
存這當前元素的個數,first
指向鏈表的第一個,last
指向列表的最後一個this
List<String> list=new LinkedList<>();
複製代碼
無參構造只是初始化了數據,並未作任何操做(初始化 size=0 first=null last=null)url
List<String> oldList=new LinkedList<>();
List<String> newList=new LinkedList<>(oldList);
複製代碼
因爲篇幅有限,addAll()方法這邊就不講了,後面另寫文章再講,裏面的操做就至關於把集合裏的元素複製到新集合裏面。spa
這裏先講get()方法,而後再講add()方法,緣由是插入方法裏用到的調用的方法個get()方法裏是同樣的
List<String> list=new LinkedList<>();
list.add("hui");
list.add("灰");
list.add("灰2");
list.add("灰3");
list.get(2);
複製代碼
List<String> list=new LinkedList<>();
list.add("hui");
複製代碼
就像開頭說的,每一個
Node
裏有三個,prev:指向前一個Node
,item:存放存入的數據,next:指向下一個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<String> list=new LinkedList<>();
list.add("hui");
list.add("灰");
list.add(1,"hk");
複製代碼
這邊插入元素時,先判斷插入的位置是否是尾部,若是不尾部的話,先調用和get()那個同樣的方法,來查找要插入位置的當前元素,而後進行插入操做
這個檢查越界的方法個get()檢查越界的方法有點不一樣,它是能夠等於
size
的,由於linkedList
的索引設計也是從0
開始的,因此size永遠比索引大1
上面說的可能有點繞,看看流程圖就明白了,哈哈
List<String> list=new LinkedList<>();
list.add("hui");
list.set(0,"灰");
複製代碼
這裏大多調用的是和get()
裏同樣的方法
按索引刪除,先找到被刪除的Node,而後解除相關連接,設置Node裏三大元素爲null,刪除後返回被刪除Node裏的item
List<String> list=new LinkedList<>();
list.add("hui");
list.add("灰");
list.remove(1);
複製代碼
item
這個刪除就比較慢
了,它內部沒有用二分查找算法,而是從頭開始一一對比,時間複雜度爲O(n)
,這個刪除也是只刪除最先添加的數據
List<String> list=new LinkedList<>();
list.add("hui");
list.remove("hui");
複製代碼
unlink()
方法就是上面講的那個
List<String> list=new LinkedList<>();
list.add("hui");
list.clear();
複製代碼
LinkedList
裏刪除,添加操做通常就兩個步驟,變換先後Node指向的地址,刪除操做把對應Node裏的三個變量都設置爲null
,方便GC
回收。
若是要刪除元素時,最好選擇傳入索引刪除,他比直接傳入要刪除的對象的方法要快不少