Вставка в двусвязный список

У меня проблема с добавлением элементов в список понравившихся

public class LinkedList {
    public Node first;
    public Node last;

    public LinkedList() {
        first = null;
        last = null;
    }

    public void addFirst(Student student) {
        Node f = first;
        Node newNode = new Node(student);
        first = newNode;
        if (f == null) last = newNode;
        else f.previous = newNode;
    }

    public void addLast(Student student) {
        Node l = last;
        Node newNode = new Node(student);
        last = newNode;
        if (l == null) first = newNode;
        else {
            l.next = newNode;
        }
    }


    public void display() {
        Node current = first;
        while (current != null) {
            //print...
            current = current.next;
        }
    }

Моя проблема в том, что когда я запускаю:

list.addLast(1);
list.addFirst(2);
list.display();

Он отображает только «2» метода «отображения», просто не может видеть последний добавленный элемент.
Но если я запускаю:

list.addFirst(2);
list.addLast(1);

Он будет отображать оба. Что с этим не так? Спасибо.


person Nikita    schedule 25.10.2011    source источник


Ответы (2)


в addFirst вы также должны поставить newNode.next = f, прямо сейчас вы просто обновляете одну сторону двунаправленного отношения. А так как дисплей использует следующее поле, он работает не так, как вы ожидаете.

Точно так же в addLast вам нужно добавить newNode.previous = l, однако, поскольку предыдущее поле не используется в методе отображения, оно не отображается с ошибками при его выполнении.

person Steven    schedule 25.10.2011

Если этот список дважды связан, разве вы не должны добавлять ссылку в newNode на элементы, которые идут до/после него?

Ваш метод display() проходит по node.next, но в addFirst() вы никогда не устанавливаете .next, поэтому, если вы вызовете addFirst() несколько раз и только этот метод, что display() напечатает?

person matt b    schedule 25.10.2011
comment
Я понимаю, он напечатает только последний добавленный элемент. - person Nikita; 25.10.2011