LinkedList添加元素有兩個方法:add(E e)和add(int index,E e)。
add(E e)是直接在隊尾添加元素。再看一下linkLast(E e)方法,源碼如下。
LinkedList會記錄連結清單的最後一個節點last,
首先建立新的節點,新節點的pre就是隊列的最後一個節點last,新節點的next為null,
如果last為空表示這個連結清單為空,新節點就是首節點first。
如果last不為空表示連結清單不為空,将last節點的next指針指向新節點。
add(int index,E e)是根據元素插入到指定位置上,index表示連結清單的位置
首先檢查index是否超過連結清單大小,即index 是否會大于連結清單的size。
如果index等于連結清單的大小,添加元素就是在連結清單隊尾添加元素,和add(E e) 操作一緻。
如果不等會size大小就調用linkBefore方法,首先在該方法的第二個參數使用了node方法。node方法源碼如下:
node方法通過連結清單的位置找到連結清單的元素。這裡用到了一個size的右移運算,size>>1表示size/2。首先判斷index是在連結清單的前一半還是後一半,因為linkedList是雙連結清單,可以往前和往後進行周遊。如果在前半部分就從首節點往後周遊,如果在後半部分就從最後一個節點往前周遊,這樣最多周遊size的一半,避免周遊整個連結清單。
找到index對應的元素後執行linkedBefore方法
建立節點,節點pre就是succ的pre,節點的next就是succ。
将succ.pre指向新節點。
succ的pre為null,succ即為首節點,将first指派給首節點
succ的pre不為空,則把succ的上一節點的next指向新節點
LinkedList,隻有兩種添加方式,一種是在清單最後添加(linkLast),一種是在清單某個元素前面添加 (linkBefore)。
LinkLast,首先建立一個新節點,節點pre指向最後一個節點,最後一個節點的next指向新節點。
LinkBefore,首先根據index下标擷取到元素的位置,建立新節點,新節點的pre就是元素的pre,新節點的next就是該元素。元素的pre的next指向新元素。
LinkedList為何是雙連結清單,連結清單主要缺點是查詢速度很慢,添加或者删除都要找到要添加和删除的節點,而使用雙連結清單,每次周遊循環前,都會判斷一下索引是在連結清單的前半部分還是後半部分。如果是前半部分的話,從首部周遊到中間。如果是後半部分,從尾部周遊到中間。