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

#java #linked-list #doubly-linked-list

#java #связанный список #двусвязный список

Вопрос:

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

 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);
  

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

Ответ №1:

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

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

Комментарии:

1. Я понимаю, он напечатает только последний добавленный элемент.

Ответ №2:

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

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

Ответ №3:

 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;
}