好吧,总的来说,我要在这里做的是从双向链表中删除所有值e的实例。据我所知,我的逻辑至少在很大程度上是正确的,但是由于某种原因,它实际上并没有删除测试用例中的任何节点。
public boolean removeAll(int e) {
DIntNode dummy = head,next = null;
if (head == null)
return false;
while (dummy != null) {
if (dummy.getData() == e) {
next = dummy.getNext();
dummy.getNext().setPrev(null);
dummy = next;
return true;
}
else
dummy = dummy.getNext();
}
return false;
}
这是我目前的方法代码。我的逻辑是使用一个从头开始的虚拟DIntNode和一个“下一个”节点来帮助我缩小列表。换句话说,如果列表类似于“ 1 <-> 1 <-> 2 <-> 3”,则该函数理论上会将其更改为“ 2 <-> 3”。这是布尔函数的原因是因为如果将给定值从列表中删除,则我必须返回true。
在我所缺少的逻辑中是否又迈出了一步,或者方法论本身就是不可靠的?在这一点上我非常不确定,因此将不胜感激。
答案 0 :(得分:2)
您设置了
dummy.getNext()。setPrev(null);
但是上一个节点也引用了您尝试删除的下一个节点。您应该将此参考设置为下一个有效值。 那是因为当您想要获取所有链表时,由于下一个节点引用,先前的值仍然知道您要删除的节点
答案 1 :(得分:0)
您可以尝试以下代码:
if (dummy.getData() == e) {
DIntNode temp = dummy.getPrevious();
temp.next = dummy.getNext();
temp = dummy.getNext();
temp.previous = dummy.getPrevious();
return true;
}
这使用了以前的参考。因此,上一个节点现在将引用您的虚拟节点(要删除的节点)的下一个节点。同样,虚拟节点的下一个节点将引用您的虚拟节点的前一个节点。因此,虚拟节点将从其双重链接列表中删除其连接/链接,这就是我们想要的!
请尝试。
答案 2 :(得分:0)
该方法在第一次遇到“ e”之后退出。
如果要删除'e'的所有实例,则应具有以下内容:
boolean listChanged = false;
while (dummy != null) {
if (dummy.getData() == e) {
// update list
...
listChanged = true;
}
...
}
return listChanged;
答案 3 :(得分:0)
代码有两个问题:
重新链接双向链接列表时(从A-B-C删除B的情况),您需要将A的下一个节点设置为C 以及 C的前一个节点为A。尝试保留方法名称:
A.setNext(current.getNext());
C.setNext(current.getPrev());
对于您的代码,如果发现一个事件,则return
,这意味着自您跳出该方法以来,不会删除任何其他实例。您可能需要一个新的boolean removed
变量,将其设置为false
,将return true
更改为removed = true
,将return false
更改为return removed
。 / p>
答案 4 :(得分:0)
此外,您不应该这样编写代码:
dummy.getNext().setPrev(...); // throws NPE if next is null