Java使用链表(无虚拟头结点,有尾节点)实现队列

Java使用链表(无虚拟头结点,有尾节点)实现队列


接口interface Queue<E>

public interface Queue<E> {

	int getSize();
	boolean isEmpty();
	void enqueue(E e);//入队
	E dequeue();//出队
	E getFront();//获得队首元素
}

使用链表实现接口并测试

/**
 * @author yinglongwu
 */
//使用带尾节点的链表实现队列
//从head端删除元素(队首),从tail端插入元素(队尾)
public class LinkedListQueue<E> implements Queue<E> {

	//定义链表的节点类
	private class Node{
		public E e;//存放这个节点的元素
		public Node next;//这个节点指向的下一个节点
		
		private Node(E e, Node next) {
			this.e = e;
			this.next = next;			
		}
		
		public Node (E e) {
			this(e,null);
		}
		
		public Node() {
			this(null,null);
		}
		
		//重写toString方法,方便打印节点的信息
		@Override
		public String toString() {
			return e.toString();
		}
	}
	
	private Node head,tail; //添加一个尾节点变量,便于实现队列
	private int size;
	
	//无参构造
	public LinkedListQueue() {
		head = null;
		tail = null;
		size = 0;
	}

	@Override
	public int getSize() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	//入队,从链表尾部
	@Override
	public void enqueue(E e) {
		if (tail == null) {
			tail = new Node(e);
			head = tail;
		} else {
			tail.next = new Node(e);
			tail = tail.next;
		}
		size++;
	}

	//出队,从链表头部
	@Override
	public E dequeue() {
		if (isEmpty()) {
			throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
		}
		
		Node retNode = head;//存放要被删除的头结点
		head = head.next;	//新的头结点
		retNode.next = null;
		if (head == null) {	//如果新的头结点为空,那么尾节点也应该为空
			tail = null;
		}
		size--;
		return retNode.e;
	}

	//获取队首元素
	@Override
	public E getFront() {
		if (isEmpty()) {
			throw new IllegalArgumentException("Queue is empty.");
		}
		return head.e;
	}
	
	//重写toString方法,便于打印
	@Override
	public String toString() {
		StringBuilder res = new StringBuilder();
		res.append("Queue: front ");//队首
		Node cur = head;
		while (cur != null) {
			res.append(cur + "->");
			cur = cur.next;
		}
		res.append("NULL tail");//队尾
		return res.toString();
	}
	
	//测试
	public static void main(String[] args) {
		
		LinkedListQueue<Integer> queue = new LinkedListQueue<Integer>();
		for (int i = 0; i < 10; i++) {
			queue.enqueue(i);//入队
			System.out.println(queue);
			
			if (i%3==2) {//每三个元素出队一次
				queue.dequeue();
				System.out.println(queue);
			}
		}
	}
}

输出结果
在这里插入图片描述

发布了318 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43594119/article/details/105335693