繁体   English   中英

通过使用“ head.next”而不是“ head”作为起点来反转带有虚拟节点的双向链表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM