LinkedList 源碼小解

1、成員 private transient Entry<E> header = new Entry<E>(null, null, null); private transient int size = 0; 底層維護的是一個Entry鏈表(雙向循環鏈表) 2、LinkedList.Entry類 成員 E element; //data
Entry<E> next; //前指針
Entry<E> previous; //後指針
 3、方法 1public LinkedList() { header.next = header.previous = header; } 該方法構造了一個新的Entry鏈表,先後指針都指向自身 2public E getFirst() { if (size==0) throw new NoSuchElementException(); return header.next.element; } 獲取鏈表中第一個元素 3public E getLast() { if (size==0) throw new NoSuchElementException(); return header.previous.element; } 獲取鏈表中最後一個元素 4private E remove(Entry<E> e) { if (e == header) throw new NoSuchElementException(); E result = e.element; e.previous.next = e.next; e.next.previous = e.previous; e.next = e.previous = null; e.element = null; size--; modCount++; return result; } 移除鏈表中的某個元素 5private Entry<E> addBefore(E e, Entry<E> entry) { Entry<E> newEntry = new Entry<E>(e, entry, entry.previous); newEntry.previous.next = newEntry; newEntry.next.previous = newEntry; size++; modCount++; return newEntry; } 插入一個元素 6public boolean addAll(int index, Collection<? extends E> c) { if (index < 0 || index > size) throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size); Object[] a = c.toArray(); int numNew = a.length; if (numNew==0) return false; modCount++; Entry<E> successor = (index==size ? header : entry(index)); Entry<E> predecessor = successor.previous; for (int i=0; i<numNew; i++) { Entry<E> e = new Entry<E>((E)a[i], successor, predecessor); predecessor.next = e; predecessor = e; } successor.previous = predecessor; size += numNew; return true; } 在鏈表最後面添加 7private Entry<E> entry(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size); Entry<E> e = header; if (index < (size >> 1)) { for (int i = 0; i <= index; i++) e = e.next; } else { for (int i = size; i > index; i--) e = e.previous; } return e; } 得到index對應的Entry對象,若是index>size>>1則使用前指針,若是index<size>>1 則使用後指針遍歷到索引處 8public int indexOf(Object o) { int index = 0; if (o==null) { for (Entry e = header.next; e != header; e = e.next) { if (e.element==null) return index; index++; } } else { for (Entry e = header.next; e != header; e = e.next) { if (o.equals(e.element)) return index; index++; } } return -1; } 獲取元素對應的索引位置 9public boolean removeLastOccurrence(Object o) { if (o==null) { for (Entry<E> e = header.previous; e != header; e = e.previous) { if (e.element==null) { remove(e); return true; } } } else { for (Entry<E> e = header.previous; e != header; e = e.previous) { if (o.equals(e.element)) { remove(e); return true; } } } return false; } 移除最後一次出現的元素 10private class ListItr implements ListIterator<E> list中用來遍歷的iterator類型 11public Iterator<E> descendingIterator() { return new DescendingIterator(); } private class DescendingIterator implements Iterator 用於倒序遍歷的iterator
相關文章
相關標籤/搜索