输出null的LinkedList的Java实现

时间:2019-02-20 21:47:47

标签: java linked-list null tostring singly-linked-list

我在这里遇到了麻烦,我正在实现自己的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 ]

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

此行:

last.next = new Node<>(e, null);

应该在向列表中添加第一个元素时抛出NullPointerException,因为列表中的firstlast应该为null是空的。显然不会在您身上出错的事实意味着,在将任何内容添加到列表之前,last必须指向有效的Node对象。您的帖子中并没有包含所有代码,但是我非常有信心,您会在创建新的Node并在调用firstlast时将其指向list的构造函数,这意味着您的列表将从“空”节点开始。

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