`

LinkList 部分源码导读

阅读更多


背景:

为了更加好了解LinkList的工作原理,上面是链表的示意图

  private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;

    /**
     * Constructs an empty list.
     */
    public LinkedList() {
        header.next = header.previous = header;
    }


定义了一个内部类header变量,其实起到了首节点的标志作用,不存放任何元素(上图的一个节点)

private transient Entry<E> header = new Entry<E>(null, null, null);

  private static class Entry<E> {
	E element;
	Entry<E> next;
	Entry<E> previous;

	Entry(E element, Entry<E> next, Entry<E> previous) {
	    this.element = element;
	    this.next = next;
	    this.previous = previous;
	}
    }

  • 下面创建一个节点

 public boolean add(E e) {
	addBefore(e, header);
        return true;
    }

    private 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;
    }

上面可以转换成下面的方式
Entry<E> newEntry = new Entry<E>(e, header, header.previous);


当插入第一个节点是,传入了e,header两个元素,header是刚开始创建的头指针,newEntry1的previous对象为header,节点的size增加1
  • 因此newEntry1.previous.next= header.next=newEntry1
  • 因此newEntry1.next.previous= header.previous=newEntry1


当插入第二个节点是,传入了e,header两个元素,header是刚开始创建的头指针,newEntry2的previous对象为header,节点的size增加1
  • 因此newEntry2.previous.next= newEntry1.next=newEntry2
  • 因此newEntry2.next.previous= header.previous=newEntry2

..... 依次类推







  • 大小: 8.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics