下面集中看remove相關(guān)操作的方法。
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 }
幾個(gè)remove方法最終都是調(diào)用了一個(gè)私有方法:remove(Entry《E》 e),只是其他簡(jiǎn)單邏輯上的區(qū)別。下面分析remove(Entry《E》 e)方法。
1 private E remove(Entry《E》 e) {
2 if (e == header)
3 throw new NoSuchElementException();
4 // 保留將被移除的節(jié)點(diǎn)e的內(nèi)容
5 E result = e.element;
6 // 將前一節(jié)點(diǎn)的next引用賦值為e的下一節(jié)點(diǎn)
7 e.previous.next = e.next;
8 // 將e的下一節(jié)點(diǎn)的previous賦值為e的上一節(jié)點(diǎn)
9 e.next.previous = e.previous;
10 // 上面兩條語(yǔ)句的執(zhí)行已經(jīng)導(dǎo)致了無(wú)法在鏈表中訪問(wèn)到e節(jié)點(diǎn),而下面解除了e節(jié)點(diǎn)對(duì)前后節(jié)點(diǎn)的引用
11 e.next = e.previous = null;
12 // 將被移除的節(jié)點(diǎn)的內(nèi)容設(shè)為null
13 e.element = null;
14 // 修改size大小
15 size--;
16 modCount++;
17 // 返回移除節(jié)點(diǎn)e的內(nèi)容
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 }
調(diào)用父類的clone()方法初始化對(duì)象鏈表clone,將clone構(gòu)造成一個(gè)空的雙向循環(huán)鏈表,之后將header的下一個(gè)節(jié)點(diǎn)開(kāi)始將逐個(gè)節(jié)點(diǎn)添加到clone中。最后返回克隆的clone對(duì)象。
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 }
創(chuàng)建大小和LinkedList相等的數(shù)組result,遍歷鏈表,將每個(gè)節(jié)點(diǎn)的元素element復(fù)制到數(shù)組中,返回?cái)?shù)組。
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 }
評(píng)論