从双向链接列表中删除所有给定值的出现

时间:2019-03-01 09:24:24

标签: java

好吧,总的来说,我要在这里做的是从双向链表中删除所有值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。

在我所缺少的逻辑中是否又迈出了一步,或者方法论本身就是不可靠的?在这一点上我非常不确定,因此将不胜感激。

5 个答案:

答案 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)

代码有两个问题:

  1. 重新链接双向链接列表时(从A-B-C删除B的情况),您需要将A的下一个节点设置为C 以及 C的前一个节点为A。尝试保留方法名称:

    A.setNext(current.getNext());

    C.setNext(current.getPrev());

  2. 对于您的代码,如果发现一个事件,则return,这意味着自您跳出该方法以来,不会删除任何其他实例。您可能需要一个新的boolean removed变量,将其设置为false,将return true更改为removed = true,将return false更改为return removed。 / p>

答案 4 :(得分:0)

此外,您不应该这样编写代码:

dummy.getNext().setPrev(...); // throws NPE if next is null