下面集中看remove相關操作的方法。
remove()
1 public E remove() {
2 return removeFirst();
3 }
remove(int index)
1 public E remove(int index) {
2 return remove(entry(index));
3 }
remove(Object o)
1 public boolean remove(Object o) {
2 if (o==null) {
3 for (Entry《E》 e = header.next; e != header; e = e.next) {
4 if (e.element==null) {
5 remove(e);
6 return true;
7 }
8 }
9 } else {
10 for (Entry《E》 e = header.next; e != header; e = e.next) {
11 if (o.equals(e.element)) {
12 remove(e);
13 return true;
14 }
15 }
16 }
17 return false;
18 }
removeFirst()
1 public E removeFirst() {
2 return remove(header.next);
3 }
removeLast()
1 public E removeLast() {
2 return remove(header.previous);
3 }
removeFirstOccurrence()
1 public boolean removeFirstOccurrence(Object o) {
2 return remove(o);
3 }
removeLastOccurence()
1 public boolean removeLastOccurrence(Object o) {
2 if (o==null) {
3 for (Entry《E》 e = header.previous; e != header; e = e.previous) {
4 if (e.element==null) {
5 remove(e);
6 return true;
7 }
8 }
9 } else {
10 for (Entry《E》 e = header.previous; e != header; e = e.previous) {
11 if (o.equals(e.element)) {
12 remove(e);
13 return true;
14 }
15 }
16 }
17 return false;
18 }
幾個remove方法最終都是調用了一個私有方法:remove(Entry《E》 e),只是其他簡單邏輯上的區別。下面分析remove(Entry《E》 e)方法。
1 private E remove(Entry《E》 e) {
2 if (e == header)
3 throw new NoSuchElementException();
4 // 保留將被移除的節點e的內容
5 E result = e.element;
6 // 將前一節點的next引用賦值為e的下一節點
7 e.previous.next = e.next;
8 // 將e的下一節點的previous賦值為e的上一節點
9 e.next.previous = e.previous;
10 // 上面兩條語句的執行已經導致了無法在鏈表中訪問到e節點,而下面解除了e節點對前后節點的引用
11 e.next = e.previous = null;
12 // 將被移除的節點的內容設為null
13 e.element = null;
14 // 修改size大小
15 size--;
16 modCount++;
17 // 返回移除節點e的內容
18 return result;
19 }
clone()
1 public Object clone() {
2 LinkedList《E》 clone = null;
3 try {
4 clone = (LinkedList《E》) super.clone();
5 } catch (CloneNotSupportedException e) {
6 throw new InternalError();
7 }
8 clone.header = new Entry《E》(null, null, null);
9 clone.header.next = clone.header.previous = clone.header;
10 clone.size = 0;
11 clone.modCount = 0;
12 for (Entry《E》 e = header.next; e != header; e = e.next)
13 clone.add(e.element);
14 return clone;
15 }
調用父類的clone()方法初始化對象鏈表clone,將clone構造成一個空的雙向循環鏈表,之后將header的下一個節點開始將逐個節點添加到clone中。最后返回克隆的clone對象。
toArray()
1 public Object[] toArray() {
2 Object[] result = new Object[size];
3 int i = 0;
4 for (Entry《E》 e = header.next; e != header; e = e.next)
5 result[i++] = e.element;
6 return result;
7 }
創建大小和LinkedList相等的數組result,遍歷鏈表,將每個節點的元素element復制到數組中,返回數組。
toArray(T[] a)
1 public 《T》 T[] toArray(T[] a) {
2 if (a.length 《 size)
3 a = (T[])java.lang.reflect.Array.newInstance(
4 a.getClass().getComponentType(), size);
5 int i = 0;
6 Object[] result = a;
7 for (Entry《E》 e = header.next; e != header; e = e.next)
8 result[i++] = e.element;
9 if (a.length 》 size)
10 a[size] = null;
11 return a;
12 }
評論
查看更多