[TOC]
# 分析
帶有尾指針的鏈表

改進下
從head端刪除元素,從tail端插入元素
這邊不用虛擬頭節點
由于沒有dummyHead,要注意鏈表為空的情況
# 代碼
## 接口
~~~
public interface Queue<E> {
int getSize();
boolean isEmpty();
void enqueue(E e);
E dequeue();
E getFront();
}
~~~
## 實現類
~~~
public class LinkedListQueue<E> implements Queue<E> {
private class Node {
public E e;
public Node next;
public Node(E e, Node next) {
this.e = e;
this.next = next;
}
public Node(E e) {
this(e, null);
}
public Node() {
this(null, null);
}
@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端插入元素
tail.next = new Node(e);
//插入后的元素就在tail的后面
tail = tail.next;
}
//維護下size
size++;
}
//出隊操作
@Override
public E dequeue() {
if (isEmpty()) {
//如果是空的隊列就不能出隊
throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
}
//出隊從頭部出,這個元素就是出隊的元素
Node retNode = head;
//把頭指針指向出隊元素的下一個,但是要注意指向null的情況
head = head.next;
retNode.next = null;
//當這個頭指針指向null,表示隊列是空
if (head == null) {
tail = null;
}
//維護下size
size--;
return retNode.e;
}
@Override
public E getFront() {
if (isEmpty()) {
//如果是空的隊列就不能出隊
throw new IllegalArgumentException("Queue is empty.");
}
return head.e;
}
@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);
}
}
}
}
~~~
## 測試
~~~
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);
}
}
}
~~~