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,因为 firstlast 应该是 null 当列表为空时。事实上,它显然没有在您身上出错,这意味着 last 必须指向一个有效的 Node 对象,然后才能将任何内容添加到您的列表中。您的 post 中没有所有代码,但我非常有信心您正在创建一个新的 Node 并将 firstlast 指向它当您调用列表的构造函数时,这意味着您的列表将以 "empty" 节点开始。

应该做的是从 firstlast 都等于 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 为空是正确的)。