使用链表实现队列
要满足队列先入先出的特征需要2个指针,一个指向队头元素,一个指向队尾元素。
当入队列时,在链表的表尾插入元素;当出队列时,在链表的表头删除元素。对于单链表而言,删除当前指针所指的元素是不太好实现的(删除尾结点不太好实现),因此将出队列操作实现为在链表的表头删除元素。
tips:单链表删除表头元素易实现,删除表尾元素需要遍历找到表尾结点的前驱结点
在jdk中,java.util.LinkedList 类就同时实现了栈和队列的功能。push/pop方法实现了入栈、出栈,offer/poll实现了入队列、出队列。
使用链表实现队列的代码如下:
public class Queue<Item> {
private Node first;
private Node last;
private int n;
public void enqueue(Item item) {
//在链表尾部插入结点
Node oldLast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty()) {
//队列插入第一个元素
first = last;
} else {
oldLast.next = last;
}
n++;
}
public Item dequeue() {
//在链表表头删除结点,(对单链表而言,不好删除表尾结点)
Item item = first.item;
first = first.next;
n--;
if (isEmpty()) {
//删除队列中最后一个元素
last = null;
}
return item;
}
public boolean isEmpty() {
return n == 0 ? true : false;
}
public int size() {
return n;
}
class Node {
Node next;
Item item;
}
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
queue.enqueue(10);
queue.enqueue(100);
System.out.println(queue.size());
System.out.println(queue.dequeue());
System.out.println(queue.size());
queue.dequeue();
System.out.println(queue.size());
System.out.println(queue.dequeue());
}
}
参考: