链表之循环双链表

双节点类:

public class DoubleNode<T> {
	public T data;
	public DoubleNode<T> prev, next;

	public DoubleNode(T data, DoubleNode<T> prev, DoubleNode<T> next) {
		this.data = data;
		this.prev = prev;
		this.next = next;
	}

	public DoubleNode(T data) {
		this.data = data;
	}

	public DoubleNode() {
	}

}

循环双节点链表:

/*
 * 循环双链表最后一个头结点的next链指向头结点
 * 头结点的prev链指向最后一个节点
 */
public class CirDoublyList<T> {
	public DoubleNode<T> head;

	/*
	 * 构造空的循环双链表
	 */
	public CirDoublyList() {
		this.head = new DoubleNode<T>();
		this.head.prev = this.head;
		this.head.next = this.head;
	}

	/*
	 * 判断双链表是否为空
	 */
	public boolean isEmpty() {
		return this.head.next == this.head;
	}

	/*
	 * 将x插入为第i个元素,x!=null,返回x节点 对i容错,若i<0,则头插入,若i>长度n,则尾插入 时间复杂度O(n)
	 */
	public DoubleNode<T> insert(int i, T x) {
		if (x == null)
			throw new NullPointerException("x==null"); // x为空,则抛出空异常
		DoubleNode<T> front = this.head;
		for (int j = 0; front.next != this.head && j < i; j++) // 寻找第i-1个,或最后一个节点
			front = front.next;
		DoubleNode<T> q = new DoubleNode<T>(x, front, front.next);
		front.next.prev = q;
		front.next = q;
		return q;
	}

	/*
	 * 尾插入x元素,返回x节点,算法在头结点之前插入 时间复杂度为O(1)
	 */
	public DoubleNode<T> insert(T x) {
		if (x == null)
			throw new NullPointerException("x==null");
		DoubleNode<T> q = new DoubleNode<T>(x, head.prev, head);
		head.prev.next = q;
		head.prev = q;
		return q;
	}

	/*
	 * 返回所有元素的描述字符串(元素次序从后向前 ) 方法体省略了,有时间再补充
	 */
	public String toPreviousString() {
		return "null";
	}

	/*
	 * 移除最后一个元素,方法体暂时省略
	 */
	public void removeLast() {

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
参考书籍:《数据结构(java版)》叶核亚,有不懂的,可以再看一下这本书

猜你喜欢

转载自blog.csdn.net/yuangan1529/article/details/80248846