Ну, это из-за этой части логики
Node last = head;
while(last!=null) {
last = last.next;
last.next = newNode; //// This shouldn't happen.
}
Как только связанный список уже создан, вы пытаетесь перейти к последнему элементу. Однако во время этого обхода вы также изменили следующий указатель, на который указывал узел.
Попробуйте изменить свою логику на:
public Node insertEnd(int data) {
Node newNode = new Node(data);
newNode.next = null;
if (head == null) {
head = newNode;
return newNode;
}
Node last = head;
while(last.next != null) {
last = last.next;
}
last.next = newNode;
newNode.previous = last;
return newNode;
}