下面集中看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 }
评论
查看更多