Java LinkedList输出null的实现
Java Implementation of LinkedList outputting null
我在这里遇到了一些麻烦,我正在实现我自己的链接列表 class,它可以满足您的期望,它将元素添加到列表并使用 ToString 方法输出它们。出于某种原因,它可以很好地将元素添加到列表中,但是当需要输出列表时,它会在前面添加一个空元素并忽略打印最后一个元素。这是我的主要 class 代码:
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);
}
}
这是添加和 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 ]
如有任何帮助,我们将不胜感激。谢谢。
这一行:
last.next = new Node<>(e, null);
应该 将第一个元素添加到列表时抛出一个 NullPointerException
,因为 first
和 last
应该是 null
当列表为空时。事实上,它显然没有在您身上出错,这意味着 last
必须指向一个有效的 Node
对象,然后才能将任何内容添加到您的列表中。您的 post 中没有所有代码,但我非常有信心您正在创建一个新的 Node
并将 first
和 last
指向它当您调用列表的构造函数时,这意味着您的列表将以 "empty" 节点开始。
你应该做的是从 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
为空是正确的)。
我在这里遇到了一些麻烦,我正在实现我自己的链接列表 class,它可以满足您的期望,它将元素添加到列表并使用 ToString 方法输出它们。出于某种原因,它可以很好地将元素添加到列表中,但是当需要输出列表时,它会在前面添加一个空元素并忽略打印最后一个元素。这是我的主要 class 代码:
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);
}
}
这是添加和 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 ]
如有任何帮助,我们将不胜感激。谢谢。
这一行:
last.next = new Node<>(e, null);
应该 将第一个元素添加到列表时抛出一个 NullPointerException
,因为 first
和 last
应该是 null
当列表为空时。事实上,它显然没有在您身上出错,这意味着 last
必须指向一个有效的 Node
对象,然后才能将任何内容添加到您的列表中。您的 post 中没有所有代码,但我非常有信心您正在创建一个新的 Node
并将 first
和 last
指向它当您调用列表的构造函数时,这意味着您的列表将以 "empty" 节点开始。
你应该做的是从 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
为空是正确的)。