Java-реализация LinkedList с нулевым выводом - PullRequest
0 голосов
/ 21 февраля 2019

У меня возникли некоторые проблемы, я реализую свой собственный класс Linked List, который делает то, что вы ожидаете, он добавляет элементы в список и, используя метод ToString, выводит их.По какой-то причине он добавляет элементы в список нормально, но когда пришло время выводить список, он добавляет нулевой элемент вперед и игнорирует печать последнего элемента.Вот мой основной код класса:

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 голосов
/ 21 февраля 2019

Эта строка:

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

должна добавить NullPointerException при добавлении первого элемента в список, потому что first и last должны быть nullкогда список пуст.Тот факт, что он, по-видимому, не содержит ошибок, означает, что last должен указывать на действительный объект Node, прежде чем вы добавите что-либо в свой список.В вашем посте нет всего вашего кода, но я уверен, что вы создаете новый Node и указываете на него first и last, когда вызываете конструктор списка, что означает, чтоваш список будет начинаться с «пустого» узла.

То, что вы должны сделать , должно начинаться с 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 элемента списка равно нулю).

...