Проблема в том, что ваш список поврежден. В точке, где у вас есть 2 элемента в списке, это выглядит примерно так:
- Список {info = Node (5,6), prev = null, next = 2}
- Список {info = Node (1,3), prev = 2, next = null}
Woops, обратите внимание, что второй элемент в поле prev списка указывает на себя? Ваша проблема в этом методе:
public List addList(List newList) {
// ...
newList.first().setPrev(ref.last()); // <-- here
}
В этой строке ref.last () - это метод, который циклически просматривает последний элемент в списке, ref. Однако последний элемент не соответствует ожидаемому, поскольку предыдущая строка выглядит следующим образом:
ref.last().setNext(newList.first());
То, что вы хотите найти, это последний элемент, который был бы до , вы устанавливаете его следующее поле, добавляя новый список в конце. Однако, снова вызвав метод last , вы обнаружите последний элемент new после добавления нового списка. Вот почему его последний узел в конечном итоге указывает на себя.
Измените метод addList , чтобы он выглядел следующим образом:
public List addList(List newList) {
if(newList.info() == null)
return this;
List ref = this;
List last = ref.last();
last.setNext(newList.first());
newList.first().setPrev(last);
return ref;
}
... и это будет работать. Кэшируя ссылку на конец списка перед его изменением, вы получите правильную ссылку.
Несмотря на это, ваш код немного сложнее, чем должен быть. Вы должны посмотреть пример того, как реализовать двойной связанный список, и вы найдете примеры, которые покажут вам, как сделать это намного проще. В частности, ваш метод delete слишком сложен.
Я также думаю, что у вас есть проблемы с представлением пустого списка как узла, содержащего null . Похоже, это вызывает у вас всевозможные неприятные случаи, которые вам нужно проверить.