使用链表实现队列
- 因为在队列中新增是在队尾,删除在队首,不存在在中间位置增加删除的情况,我们不需要虚拟头节点:dummyHead
- 由于没有dummyHead节点,要注意链表为空的情况
- 从head端进行删除元素,在tail端进行插入元素,head,tail均为节点
public class LinkListQueue<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 LinkListQueue(){
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;
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("LinkListQueue: 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){
LinkListQueue<Integer> queue = new LinkListQueue<>();
for(int i = 0 ; i < 10 ; i ++){
queue.enqueue(i);
System.out.println(queue);
if(i%3 ==2){
queue.dequeue();
System.out.println(queue);
}
}
}
}