为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2022-07-14 16:58:25
好吧,长话短说,我在这里要做的是从双向链表中删除值 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。我缺少逻辑中的另一个步骤,还是方法本身不可靠?在这一点上我非常不确定,所以任何和所有的帮助将不胜感激。
查看完整描述

4 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

你设置

dummy.getNext().setPrev(null);

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


查看完整回答
反对 回复 2022-07-14
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

代码有两个问题:

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

    A.setNext(current.getNext());

    C.setNext(current.getPrev());

  2. 使用您的代码,如果您发现一个出现, you return,这意味着自从您跳出该方法后,不会删除其他实例。您可能需要一个新boolean removed变量,即设置为falsereturn true更改为removed = truereturn false更改为return removed


查看完整回答
反对 回复 2022-07-14
?
慕森王

TA贡献1777条经验 获得超3个赞

该方法在第一次遇到“e”后退出。


如果你想删除'e'的所有实例,那么你应该有这样的东西:


boolean listChanged = false;

while (dummy != null) {

    if (dummy.getData() == e) {

      // update list

      ...

      listChanged = true;

    }

    ...

}

return listChanged;


查看完整回答
反对 回复 2022-07-14
?
弑天下

TA贡献1818条经验 获得超8个赞

您可以尝试使用以下代码:


if (dummy.getData() == e) {

    DIntNode temp = dummy.getPrevious();

    temp.next = dummy.getNext();

    temp = dummy.getNext();

    temp.previous = dummy.getPrevious();

    return true;

 }

这使用了以前的参考。因此,前一个节点现在将引用您的虚拟节点的下一个节点(要删除的节点)。同样,虚拟节点的下一个节点将引用您的虚拟节点的前一个节点。因此,虚拟节点将从其双向链接列表中失去其连接/链接,这就是我们想要的!


请试试。


查看完整回答
反对 回复 2022-07-14
  • 4 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信