我在这里遇到了麻烦,我正在实现自己的Linked List类,该类可以完成您所期望的工作,它将元素添加到列表中并使用ToString方法输出它们。由于某种原因,它可以将元素很好地添加到列表中,但是当需要输出列表时,它会在前面添加一个null元素,而忽略最后一个元素的打印。这是我的主要课程代码:
public class MyList {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
list.add(1); // [1]
list.add(2); // [1 2]
list.add(3); // [1 2 3]
System.out.println(list);
}
}
这是add和ToString方法:
public class LinkedList<E> {
private Node<E> first, last;
private int size = 0;
// new empty list constructor.
public LinkedList() {
first = last = new Node<>(null, null);
}
public void add(E e) {
last.next = new Node<>(e, null);
last = last.next;
++size;
}
public void addFirst(E e) {
Node<E> n = new Node<>(e, null);
n.next = first.next;
first = n;
++size;
}
public String toString() {
try {
if (first != null) {
Node<E> n = first;
String s = "[ ";
while (n.next != null) {
s = s + n.data + " ";
n = n.next;
}
return s + "]";
}
} catch (NoSuchElementException e) {
//return "List is empty!";
}
return "List is empty!";
}
当尝试编译上面的代码时,我得到以下输出(应为[ 1 2 3 ]
):
> [ null 1 2 ]
任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
此行:
last.next = new Node<>(e, null);
应该在向列表中添加第一个元素时抛出NullPointerException
,因为列表中的first
和last
应该为null
是空的。显然不会在您身上出错的事实意味着,在将任何内容添加到列表之前,last
必须指向有效的Node
对象。您的帖子中并没有包含所有代码,但是我非常有信心,您会在创建新的Node
并在调用first
和last
时将其指向list的构造函数,这意味着您的列表将从“空”节点开始。
应该要做的是从first
和last
都等于null
开始。然后在您的add()
方法中执行以下操作:
public void add(E e) {
Node newNode = new Node<>(e, null);
if(first == null) {
first = newNode;
last = newNode;
} else {
last.next = newNode;
last = last.next; // Or just last = newNode;
}
++size;
}
此外,您需要稍微使用toString()
方法,因为这一行:
while (n.next != null) {
将导致您的循环绕过列表中的最后一个元素(因为它对于列表元素的next
为空是正确的)。