![](/img/trans.png)
[英]Linked List implementation: why cannot move to head.next before creating new node
[英]Reversing a doubly-linked list with dummy nodes by using 'head.next' as a start point instead of 'head'
首先,我有一个reverse()
方法的有效实现,并且我没有在寻求帮助方面寻求帮助,因为这是一个家庭作业问题。 我的问题是出现一个错误,我想通过从列表中的第一个实数元素而不是head
虚拟节点开始,在while循环中保存迭代。
工作的reverse()
方法代码:
public void reverse() {
Node<T> current = head;
Node<T> temp = null;
tail = head;
while(current != null) {
temp = current.prev;
current.prev = current.next;
current.next = temp;
current = current.prev;
}
head = temp.prev;
}
属于该程序的示例发生错误: https : //ideone.com/KKUtMn
改变我程序的变化:
Node<T> current = head.next;
进行更改后,在对reverse()
进行调用之后,对addLast(x)
任何调用都会导致NullPointerException
。 调用reverse()
可以无错误或无问题地反转列表,我可以很好地调用addFirst(x)
,但是第一次调用addLast(x)
会抛出异常。 我觉得这很奇怪,因为对addLast(x)
的调用使用了tail
虚拟节点来插入元素,但是reverse()
中tail
的唯一用法是在循环之前分配它,并且不受任何current
影响引用。
我以为我会做出更改的原因是,当无论如何在while循环之后将其重新分配给temp.prev
时, head
第一次迭代似乎都没有用。 我也不需要循环提供的遍历,因为我可以从开始就直接直接指向第一个非虚拟节点。 我显然错了,因为这个想法行不通,但是我无法弄清楚造成这种情况的逻辑。
有任何想法吗?
问题在于您仍然在开始时设置了tail = head。 由于您永远不会反转上一个头部的上一个和下一个,因此它将不会有上一个,只有下一个。 当您调用addLast时,这会导致NullPointerException,并且他尝试获取尾部的prev;)
您可以移到列表的末尾
while(current.next != null){
current = current.next;
如果最后,您开始交换节点的下一个引用...
current.next = curr.prev
等等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.