《数据结构与算法》之链表—双端链表

2、双端链表

双端链表就是在单链表的基础上增加一个尾节点,使链表既有头节点又有尾节点,这样方便进行链表尾的访问和删除。其计算复杂度如下:1、在表头插入一个新的节点,时间复杂度O(1) ;2、在表尾插入一个新的节点,时间复杂度O(1) ;3、删除表头的节点,时间复杂度O(1) ;4、删除表尾的节点,由于只保存了表尾的节点,而没有保存表尾的前一个节点(单向,只能从前往后推),所以在删除表尾节点时需要遍历以找到表尾节点的前一个节点,需查找N-1次,也就是O(N)。

其实现代码如下:

public class DoublePointLinkedList {
	private Node head;// 头节点
	private Node tail;// 尾节点
	private int size; // 节点的个数

	private class Node {
		private Object data;
		private Node next;

		public Node(Object data) {
			this.data = data;
		}
	}

	public DoublePointLinkedList() {
		size = 0;
		head = null;
		tail = null;
	}

	// 链表头新增节点
	public void addHead(Object data) {
		Node node = new Node(data);
		if (size == 0) { // 如果链表为空,那么头节点和尾节点都是该新增节点,节点个数加1
			head = node;
			tail = node;
			size++;
		} else { // 如果链表不为空,那么原有头节点成为下一个节点,新节点成为头节点,尾节点不变,节点个数加1
			node.next = head;
			head = node;
			size++;
		}
	}

	// 链表尾新增节点
	public void addTail(Object data) {
		Node node = new Node(data);
		if (size == 0) {// 如果链表为空,那么头节点和尾节点都是该新增节点,节点个数加1
			head = node;
			tail = node;
			size++;
		} else { // 如果链表不为空,那么新节点成为下一个节点,新节点成为尾节点,节点个数加1
			tail.next = node;
			tail = node;
			size++;
		}
	}

	// 删除头部节点,成功返回true,失败返回false
	public boolean deleteHead() {
		if (size == 0) {// 当前链表节点数为0
			return false;
		}
		if (head.next == null) {// 当前链表节点数为1
			head = null;
			tail = null;
			size--;
			return true;
		} else { // 当前节点数大于1,头节点称为头节点的下一个节点
			head = head.next;
			size--;
			return true;
		}

	}

	// 判断是否为空
	public boolean isEmpty() {
		return (size == 0);
	}

	// 获得链表的节点个数
	public int getSize() {
		return size;
	}
	
	public Object getHead(){
		return head.data;
	}
	
	public Object getTail(){
		return tail.data;
	}

	// 显示节点信息
	public void display() {
		if (size > 0) {
			Node node = head;
			int tempSize = size;
			if (tempSize == 1) {// 当前链表只有一个节点
				System.out.println("[" + node.data + "]");
				return;
			}
			while (tempSize > 0) {
				if (node.equals(head)) {
					System.out.print("[" + node.data + "->");
				} else if (node.next == null) {
					System.out.print(node.data + "]");
				} else {
					System.out.print(node.data + "->");
				}
				node = node.next;
				tempSize--;
			}
			System.out.println();
		} else {// 如果链表一个节点都没有,直接打印[]
			System.out.println("[]");
		}
	}

}

测试代码如下:

private static void DoublePointLinkedListTest() {
		DoublePointLinkedList list=new DoublePointLinkedList();
		System.out.println(list.getSize());
		list.addHead("123");
		System.out.println(list.getSize());
		list.display();
		list.addTail("456");
		list.display();
		System.out.println(list.getHead());
		System.out.println(list.getTail());
		list.addHead("789");
		list.display();
	}

猜你喜欢

转载自blog.csdn.net/manbulaiyinhepan/article/details/83793236