我想通过使用Java中的链接列表来模拟队列。我的一般模式是有一个节点列表,其中两个节点指向队列的第一个和最后一个元素。当我执行dequeue()时,我想乘坐第一个元素。到目前为止,我已经完成了以下工作:
public class Node {
public Object e;
Node next;
public Node(Object e) {
this.e = e;
}
}
public class Queue {
Node queueList;
Node first, last;
int count;
public void enQueue(Object n) {
Node temp = new Node(n);
temp.next = last;
last = temp;
if (queueList == null) {
first = temp;
}
count++;
queueList=temp;
}
public Object deQueue() {
Node previous = last;
Node current = last.next;
Object num = null;
if (count == 0)
System.out.println("empty queue");
else {
while (current.next != null) {
previous = previous.next;
current = current.next;
}
num = first.e;
first = previous;
count--;
}
return num;
}
public void print() {
Node current = last;
while (current != null) {
System.out.println(current.e);
current = current.next;
}
}
}
我不想使用双链表,因此对于dequeue()操作,我要做的是用两个指针遍历我的列表,如下所示:
因此,当current.next指向null时,我希望前一个成为第一个节点。我遇到的问题是,当我打印队列中的元素时,它仍然打印出我:10、15、5、18,但18值未删除。有帮助吗?
谢谢
答案 0 :(得分:1)
基本上,我会在您的代码中纠正两件事。
首先,Queue
字段没有分配任何值,我也怀疑它的效用,基本上可以使用first
public void enQueue(Object n) {
Node temp = new Node(n);
temp.next = last;
last = temp;
if (first == null) { <--- HERE
first = temp;
}
count++;
}
第二个问题是,您永远不要将队列新头的值放在null
旁边,在这种情况下需要
public Object deQueue() {
Node previous = last;
Node current = last.next;
Object num = null;
if (count == 0) System.out.println("empty queue");
else {
while (current.next != null) {
previous = previous.next;
current = current.next;
}
num = first.e;
first = previous;
first.next = null; <--- HERE
count--;
}
return num;
}