我正在做一个涉及链接列表的家庭作业。我们必须实现一个队列ADT,而我遇到问题的一个方法是在列表的末尾添加一个节点(enqueue方法)。这是我的代码:
公共类Queue实现QueueInterface {
private Node head;
private Node tail;
private int sz;
public Queue() {
head = null;
tail = null;
sz = 0;
}
public void enqueue(T newEntry) {
Node newElement = new Node(newEntry);
newElement.next = null;
tail.next = newElement;
tail = newElement;
}
public T dequeue() {
T result = null;
if(head != null) {
result = head.data;
head = head.next;
sz--;
}
return result;
}
public T getFront() {
return head.data;
}
public boolean isEmpty() {
if (head == null) {
return true;
}
return false;
}
public void clear() {
while (!isEmpty()) {
dequeue();
}
}
@Override
public String toString() {
return "Queue [head=" + head + ", sz=" + sz + "]";
}
public class Node {
private Node next;
private T data;
public Node (T newData) {
data = newData;
}
@Override
public String toString() {
return "Node [next=" + next + ", data=" + data + "]";
}
}
}
如果有人能帮助我,我会非常感激。谢谢你的时间! :)
答案 0 :(得分:1)
你不需要这一行,接下来应该是null。
newElement.next = null;
你入队后也忘了增加sz。
如果您尝试排队到空链表,会发生什么?你将不得不处理这个案子,这就是你得到NullPointerException
答案 1 :(得分:1)
您没有处理列表为空的情况。您正在添加第一个项,tail
为null
,您将获得相应的例外。
在尝试使用tail
之前,您需要检查null
是否head
,如果是这种情况,请采取适当的行动。不要忘记设置{{1}}。
答案 2 :(得分:1)
public void enqueue(T newEntry) {
Node newElement = new Node(newEntry);
newElement.next = null;
if(tail != null)
{
tail.next = newElement;
tail = newElement;
}else
{
head=tail=newElement;
}
}
检查tail是否为null。如果tail为null,则表示这是第一个节点。将其添加为第一个节点。在尾巴后添加。
答案 3 :(得分:0)
您的排队方法会尝试将tail.next
设置为newElement
。如果尾部尚未初始化会发生什么?你会得到一个NullPointerException。