上一篇是对拿数组对顺序队列的实现。https://blog.csdn.net/qq_40301026/article/details/87908936
主要是链式队列用单链表来实现,说白了还是对单链表的应用。https://blog.csdn.net/qq_40301026/article/details/86768703
为了操作实现方便,这里采用带头结点的单链表结构。链表的头部作为队首,链表的尾部作为队尾。
一共设置两个指针,一个队首指针和一个队尾指针,如图所示。
package 队列的实现;
public interface Queue<E> {
//返回队列大小
public int getSize();
//判断队列是否为空
public boolean isEmpty();
//数据元素e入队
public void enqueue(E e);
//队首元素出队
public E dequeue();
//取队首元素
public E peek();
//清空队列
public void clear();
}
package 队列的实现;
public class Node {
private Object data;
private Node next;
public Node() {
this.data = null;
this.next = null;
}
public Node(Object data) {
this.data = data;
this.next = null;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
package 队列的实现;
/**
* 队列的实现(使用单链表)
* 有头结点,一个队首指针front,一个队尾指针rear
* 在队尾入队,在队首出队,先进先出。
* @author Administrator
*
*/
public class LinkedQueue implements Queue{
private Node head ;//头结点
private Node front;//队首指针
private Node rear;//队尾指针
private int size;//队列大小
public LinkedQueue() {
this.head = new Node();
this.front = head;
this.rear = head;
}
public LinkedQueue(Object a) {
Node head = new Node(a);
this.front = head;
this.rear = head;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void enqueue(Object e) {
Node newnode = new Node(e);//新建一个结点
rear.setNext(newnode);
rear = newnode;
size++;
}
@Override
public Object dequeue() {
Object temp = null;
if(size==0) {
throw new RuntimeException("队列为空!");
}else {
temp = front.getNext().getData();//存储队首元素
//删除链表head后面的第一个结点
front = head.getNext();//front指向head后面的第一个结点
head.setNext(front.getNext());
front.setNext(null);
front = head;//front归位
size--;
}
return temp;
}
@Override
public Object peek() {
Object temp = null;
if(size==0) {
throw new RuntimeException("队列为空!");
}else {
temp = front.getNext().getData();//存储队首元素
}
return temp;
}
@Override
public void clear() {
size = 0;
front = head;
rear = head;
head.setNext(null);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("front-->");
Node xun = front.getNext();
while(xun!=null) {
sb.append(xun.getData()+"-->");
xun = xun.getNext();
}
sb.append("rear");
return sb.toString();
}
}
测试:
package 队列的实现;
public class TestLinkedQueue {
public static void main(String[] args) {
LinkedQueue s = new LinkedQueue();
//入队列
s.enqueue(1);
s.enqueue(2);
s.enqueue(3);
//打印队列
System.out.println(s.toString());
//出队列
System.out.println(s.dequeue());
System.out.println(s.toString());
//返回队首元素
System.out.println(s.peek());
//是否为空
System.out.println(s.isEmpty());
//清空队列
s.clear();
System.out.println(s.isEmpty());
System.out.println(s.toString());
}
}