Java 以下使用链表的队列实现中的错误是什么?
我使用一个链表编写了以下队列实现,该链表不维护对尾部节点的引用。当我尝试打印队列时,它只输出头,即只输出一个节点。错误是什么?提前谢谢Java 以下使用链表的队列实现中的错误是什么?,java,linked-list,queue,Java,Linked List,Queue,我使用一个链表编写了以下队列实现,该链表不维护对尾部节点的引用。当我尝试打印队列时,它只输出头,即只输出一个节点。错误是什么?提前谢谢 package DataStructures; import java.util.Scanner; class Node { int x; Node nextNode; public Node(int x) { this.x = x; nextNode = null; } } class Q
package DataStructures;
import java.util.Scanner;
class Node {
int x;
Node nextNode;
public Node(int x) {
this.x = x;
nextNode = null;
}
}
class Queue {
Node head = null;
int n = 0;
public void enqueue(int x) {
if (n==0){
head = new Node(x);
n++;
return;
}
Node tempHead = head;
while (tempHead != null){
tempHead = tempHead.nextNode;
}
tempHead = new Node(x);
tempHead.nextNode = null;
n++;
}
public int dequeue() {
if (head == null) {
throw new Error("Queue under flow Error!");
} else {
int x = head.x;
head = head.nextNode;
return x;
}
}
public void printTheQueue() {
Node tempNode = head;
System.out.println("hi");
while (tempNode != null){
System.out.print(tempNode.x + " ");
tempNode = tempNode.nextNode;
}
}
}
public class QueueTest {
private static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
Queue queue = new Queue();
while (true){
int x = in.nextInt();
if (x == -1){
break;
} else{
queue.enqueue(x);
}
}
queue.printTheQueue();
}
}
您从未将节点分配给
nextNode
,因此您的列表要么为空,要么由一个节点组成
以下是一个解决方案:
public void enqueue(int x) {
n++;
if (head == null) {
head = new Node(x);
else {
Node last = head;
while (last.nextNode != null)
last = last.nextNode;
last.nextNode = new Node(x);
}
}
从技术上讲,您不需要
n
,但可以将其用作列表大小的缓存。您应该在deque()
中减少它,让您的队列进入以下状态:
public void enqueue(int x) {
if (n==0){
head = new Node(x);
head.nextNode=null;
n++;
return;
}
Node tempHead = head;
while (tempHead.nextNode!= null){
tempHead = tempHead.nextNode;
}
Node newNode = new Node(x);
tempHead.nextNode=newNode;
newNode.nextNode = null;
n++;
}
当您排队时,
头部
和您的新节点之间没有任何连接。@realpoint但我确实有一个对头部的临时引用,并通过它传播到最后一个节点。一旦我到达最后一个节点,我用数据键x将它的下一个节点指向新节点。如果您告诉我codeThanx中应该有什么变化,我将不胜感激。。。知道了。。。我正在将新节点()分配给tempHead,这是一个飞行引用。。相反,我应该用正确的逻辑将新节点()分配给tempHead.nextNode!!!n++应该出现在方法的末尾。是的,它是正确的!。。。。。。但是如果我删除if语句if(n==0),您的代码将崩溃,因为head为null,并且我们正在访问它的nextNode。。。。你能给我一个提示吗??