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

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


我缺少逻辑中的另一个步骤,还是方法本身不可靠?在这一点上我非常不确定,所以任何和所有的帮助将不胜感激。


慕沐林林
浏览 115回答 4
4回答

慕容森

你设置dummy.getNext().setPrev(null);但是前一个节点也引用了您尝试删除的下一个节点。您应该将此引用设置为下一个活动值。那是因为当您想获取所有链表时,前一个值仍然知道您删除的节点,因为下一个节点引用

翻翻过去那场雪

代码有两个问题:当重新链接双向链表时,从 A-B-C 中删除 B,您需要将 A 的下一个节点设置为 C,并将 C的前一个节点设置为 A。尝试保留方法名称:A.setNext(current.getNext());C.setNext(current.getPrev());使用您的代码,如果您发现一个出现, you&nbsp;return,这意味着自从您跳出该方法后,不会删除其他实例。您可能需要一个新boolean removed变量,即设置为false、return true更改为removed = true和return false更改为return removed。

慕森王

该方法在第一次遇到“e”后退出。如果你想删除'e'的所有实例,那么你应该有这样的东西:boolean listChanged = false;while (dummy != null) {&nbsp; &nbsp; if (dummy.getData() == e) {&nbsp; &nbsp; &nbsp; // update list&nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; listChanged = true;&nbsp; &nbsp; }&nbsp; &nbsp; ...}return listChanged;

弑天下

您可以尝试使用以下代码:if (dummy.getData() == e) {&nbsp; &nbsp; DIntNode temp = dummy.getPrevious();&nbsp; &nbsp; temp.next = dummy.getNext();&nbsp; &nbsp; temp = dummy.getNext();&nbsp; &nbsp; temp.previous = dummy.getPrevious();&nbsp; &nbsp; return true;&nbsp;}这使用了以前的参考。因此,前一个节点现在将引用您的虚拟节点的下一个节点(要删除的节点)。同样,虚拟节点的下一个节点将引用您的虚拟节点的前一个节点。因此,虚拟节点将从其双向链接列表中失去其连接/链接,这就是我们想要的!请试试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java