使用链表实现队列
第一种:带虚拟头节点的写法
public class MyLinkQueue {
private Node front;
private Node rear;
public MyLinkQueue() {
this.front = new Node(0);
this.rear = new Node(0);
}
//入队
public void push(int data){
Node node = new Node(data);
Node temp = front;
while(temp.next!=null){
temp = temp.next;
}
temp.next = node;
rear = node;
}
//出队
public int pull(){
if(front.next == null){
System.out.println("队列为空");
}
Node firstNode = front.next;
front.next = firstNode.next;
return firstNode.data;
}
//遍历队列
public void traverse(){
Node temp = front.next;
while(temp !=null){
System.out.print(temp.data+" ");
temp = temp.next;
}
}
static class Node{
public int data;
public Node next;
public Node(int data){
this.data = data;
}
}
public static void main(String[] args) {
MyLinkQueue linkQueue = new MyLinkQueue();
linkQueue.push(1);
linkQueue.push(2);
linkQueue.push(3);
System.out.println("第一个出队的元素为:" + linkQueue.pull());
System.out.println("队列中的元素为:");linkQueue.traverse();
}
}
第二种:不带虚拟头节点的写法
public class MyLinkQueue {
private Node front;
private Node rear;
//入队
public void push(int data) {
Node node = new Node(data);
Node temp = front;
if(front ==null){
front = node;
rear = front;
}else{
while(temp.next!=null){
temp = temp.next;
}
temp.next = node;
rear = node;
}
}
//出队
public int pull(){
if(front == null){
System.out.println("队列为空");
//return 0;
}
int data = front.data;
front = front.next;
return data;
}
//遍历队列
public void traverse(){
Node temp = front;
while(temp !=null){
System.out.print(temp.data+" ");
temp = temp.next;
}
}
static class Node{
public int data;
public Node next;
public Node(int data){
this.data = data;
}
}
public static void main(String[] args) {
MyLinkQueue linkQueue = new MyLinkQueue();
linkQueue.push(1);
linkQueue.push(2);
linkQueue.push(3);
System.out.println("第一个出队的元素为:" + linkQueue.pull());
System.out.println("队列中的元素为:");linkQueue.traverse();
}
}
在第一种写法中,在出队操作时,应该在判定为空后直接return或者将后续代码写在else块中,否则会报NullPointException