代码背后的概念是删除列表中大于前面元素的元素。在这种情况下,我的节点有一个int数据,并且可以通过它进行比较。 (这些类在扩展Comparable<>
问题是,当此代码与链表一起运行时,我得到一个nullpointexception:
[2,5,4,3,7,6,4,2,3,4,5]
应该获得的预期清单是
[2,2]
因为(5> 2)移除5然后(4> 2)移除4然后(3> 2)移除3 ......依此类推,直到它以nullpointerexception结束。
另一个例子是列表
[3,1,-2,3,6,-1,3,2,1]
该列表最终应该
[3,1,-2]
其中的调试代码用于显示哪些元素已被删除。
getter方法是基础并且工作正常。
public void deleteIncrementing() {
T largest = null;
while(head.getNext() != null || head != null) {
Node<T> temp = head.getNext();
while(temp.getValue().compareTo(head.getValue()) > 0){
largest = temp.getValue();
remove(largest);
System.out.println(largest); // debug
if(temp.getNext() == null){
break;
}
temp = head.getNext();
}
head = temp;
}
}
来自建议的伪代码:
Node<T> current = head;
Node<T> previous = null;
while(current != null) {
if (previous != null){
if (current.getValue().compareTo(previous.getValue()) > 0){
//System.out.println(current.getValue().toString());
remove(current.getValue());
}
if (current.getValue().compareTo(previous.getValue()) < 0){
//System.out.println(previous.getPrevious().getValue().toString());
//System.out.println(current.getValue().toString());
remove(previous.getValue());
}
}
previous = current;
current = current.getNext();
}
哪个仍然不正确,因为它没有考虑到倒数第一个元素,并保留最后一个元素......任何原因?
答案 0 :(得分:1)
首先,这个条件:
while (head.getNext() != null || head != null)
应该是:
while (head != null && head.getNext() != null)
始终先检查空值 !
答案 1 :(得分:1)
我不知道这是否是您的原因,但是您必须在while循环中切换测试:
while (head != null && head.getNext() != null)
首次测试head.getNext() != null
且head为null时,将抛出NullPointerException
答案 2 :(得分:0)
你过度思考这个问题。
考虑你需要完成的事情:编写一个函数,删除其值大于前一个元素的LinkedList元素。
阅读本声明后,您应该知道在LinkedList的每个点(例如当前元素和前一个元素)需要考虑的内容。因此,实际上不需要嵌套的while循环。
伪代码:
current = head
previous = null
while current is not null
is previous non-null and current > previous?
if yes: delete current
if no: do nothing
previous = current
current = current.next
看看你是否可以使用这个伪代码来简化自己的代码。
答案 3 :(得分:0)
除了对其他人提到的head
的错误检查外,我认为这有一些潜在的问题:
while(temp.getValue().compareTo(head.getValue()) > 0){
largest = temp.getValue();
remove(largest);
System.out.println(largest); // debug
if(temp.getNext() == null){
break;
}
temp = head.getNext();
}
head = temp;
temp
将引用即将被删除的节点。该节点会发生什么?我不知道,因为我不知道这是什么列表类型或remove
做什么。但是,除非列表类的文档清楚地表明remove
不会影响节点&#34; next&#34;指针,我不会指望它。作为一般规则,应在 remove
调用之前保存这类数据。 (在其他语言中,您可能有&#34;删除&#34;也明确释放存储空间,首先必须保存链接。)
更严重的问题是,即使&#34; next&#34;指针保持不变,列表末尾会发生什么。 temp
指向随后被删除的节点。它的下一个&#34;指针是null
,所以你打破了。但是你设置了head = temp
,这意味着head
现在指向一个不再在列表中的节点。我认为只有当你因head = temp
而达到这一点时才想要compareTo
- 如果你到达那里因为你到达了列表的末尾,那就不是了。{/ p>