Вставка в двусвязный список - PullRequest
2 голосов
/ 25 октября 2011

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

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», метод «display» простоя не вижу последний добавленный элемент.
Но если я запущу:

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

Он отобразит оба.Что с этим не так?Спасибо.

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

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

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

2 голосов
/ 25 октября 2011

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

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

0 голосов
/ 25 октября 2011
public void addFirst(Student student) {
    Node f = first;
    Node newNode = new Node(student);
    newNode.next = f; // this was missing
    first = newNode;
    if (f == null)
        last = newNode;
    else
        f.previous = newNode;
}

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