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过程。
初次分享,其中错误之处多多指出。