Это не работает по трем причинам, которые я вижу:
В блоке if (index == 0)
вы никогда не установите значение prev
головного узла.
В блоке else
вы никогда не проверяете, находитесь ли вы в конце списка, поэтому вы получите NullPointerException
, если вы есть.
В обоих блоках if (index == 0)
и else
вы не установите tail
, если новый узел является последним узлом.
На стороне примечание: вы используете raw генерики во всем. Никогда не используйте DLLNode
без <
сразу после него. В основном, измените все DLLNode
на DLLNode<E>
.
Вот как вы тестируете свой собственный код.
Добавьте этот метод к DLLNode
:
void verifyIntegrity() {
if (this.prev != null && this.prev.next != this)
throw new AssertionError("prev.next is corrupt");
if (this.next != null && this.next.prev != this)
throw new AssertionError("next.prev is corrupt");
}
Добавьте этот метод к DoubleLinkedList
:
void verifyIntegrity() {
int count = 0;
DLLNode<E> last = this.head;
for (DLLNode<E> node = this.head; node != null; count++, last = node, node = node.getNext())
node.verifyIntegrity();
if (this.tail != last)
throw new AssertionError("tail is corrupt");
if (this.size != count)
throw new AssertionError("size is corrupt");
}
Теперь проверьте ваш код следующим образом:
DoubleLinkedList<Integer> listHead = new DoubleLinkedList<>();
DoubleLinkedList<Integer> listTail = new DoubleLinkedList<>();
DoubleLinkedList<Integer> listMid = new DoubleLinkedList<>();
listHead.verifyIntegrity();
listTail.verifyIntegrity();
listMid.verifyIntegrity();
for (int i = 0; i < 10; i++) {
listHead.add(0, i);
listTail.add(i, i);
listMid.add(i / 2, i);
listHead.verifyIntegrity();
listTail.verifyIntegrity();
listMid.verifyIntegrity();
}