LinkedList源码分析:双向循环链表实现

来源:互联网 发布:淘宝店铺域名有什么用 编辑:程序博客网 时间:2024/05/21 14:49

java以面向对象思想实现双向循环链表

public class LinkedList<E> {    private transient Entry<E> header = new Entry<E>(null, null, null);    private transient int size = 0;    /**     * 构造方法:初始化LinkedList时为header结点分配内存     * 并且使header结点的next、previous指向header结点     */    public LinkedList() {        header.next = header.previous = header;    }        /**     * LinkedList添加一个元素,默认的在链表最后一个位置添加     * @param e     * @return     */    public boolean add(E e) {    addBefore(e, header);        return true;    }        /**     * Inserts the specified element at the beginning of this list.     *     * @param e the element to add     */    public void addFirst(E e) {    addBefore(e, header.next);    }    /**     * Appends the specified element to the end of this list.     *     * <p>This method is equivalent to {@link #add}.     *     * @param e the element to add     */    public void addLast(E e) {    addBefore(e, header);    }    /**     * 以传递header.next为例,即在第一个位置添加元素     * @param e     * @param entry 即header.next,初始时header.next的地址即header的地址     * @return     */    private Entry<E> addBefore(E e, Entry<E> entry) {    //1、为结点分配内存,新结点的next、previous指向header结点    Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);    //2、newEntry.previous即header结点,使header结点的next指向newEntry    newEntry.previous.next = newEntry;    //3、newEntry.previous即header结点, 使header结点的previous指向newEntry    newEntry.next.previous = newEntry;    size++;    return newEntry;    }        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;    }     }}

note :LinkedList的对象始终存在一个数据为NULL的header结点

添加第一个元素的过程如图所示:过程1、2、3  在代码中指出。添加第二个元素在此基础上执行1、2、3过程。

初次分享,其中错误之处多多指出。

原创粉丝点击