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