【问题标题】:Not exactly sure why my recursive linked list deletion function works? Would love an explanation不完全确定为什么我的递归链表删除功能有效?想要一个解释
【发布时间】:2017-10-18 22:01:56
【问题描述】:

我写了一个程序,它可以工作,但我认为它不应该。有人可以解释它为什么有效吗?

我有一个单链表。这是一个项目,所以我不能直接发布代码,但我会稍微改变一下问题

假设我的链接列表是数字 1、2、3、4、4、5 的列表

我需要扫描列表并删除所有重复项,因此我需要删除 4 个中的一个。我需要通过递归来做到这一点。

我正在编写的函数有它的参数/参数作为指向列表开头的指针,我将称之为 pointer

//Base cases up here
if (pointer->value == pointer->next->value){
    *toDelete = pointer;
     pointer = pointer->next;
     delete toDelete;
     recur the function
} else recur(pointer->next);

现在这段代码有效,我认为它不应该,因为我从未将前一个节点连接到我删除节点之后的节点。然而,当我查看结果时,所有正确的节点都已连接,并且所有应该删除的节点都被删除了。我在这里误解了什么吗? pointer = pointer->next 不仅仅将 pointer 指向下一个节点的地址吗?

谢谢!

【问题讨论】:

  • 您好,您可以发布完整的代码吗?如果您遗漏了某些部分,我们无法判断您做什么或不做什么。
  • 如果你(真的)想要一个单链表数据结构,那么看在 $DEITY 的份上,只需使用std::forward_list 就可以了。请。不要重新发明轮子——拜托。更好的是,只需使用std::vector;它可能在现实生活条件下或多或少总是做得更好(不管算法复杂性等和其他理论问题)。
  • @JesperJuhl 不幸的是,我必须按照任务的要求去做。不是我的选择。
  • @SamirAguiar 这就是我们学习的方式,不是吗 :) 观察一些东西,然后质疑它是如何工作的 :)
  • @Duxa:如果你正在做作业;请在您的问题中告诉我们。这有助于防止闲聊。

标签: c++ pointers singly-linked-list


【解决方案1】:

现在这段代码可以工作,我认为它不应该,因为我从来没有将前一个节点连接到我删除节点之后的那个。

没错。您的函数可能看起来有效,但它确实显示出未定义行为的迹象。你需要使用:

if ( pointer->next != nullptr && pointer->value == pointer->next->value){
    auto toDelete = pointer->next;
    pointer->next = pointer->next->next;
    delete toDelete;

    // Recurse with the same pointer since you might have 4 4 4
    // in the original list.
    recur(pointer);
}
else {    
   recur(pointer->next);
}

【讨论】:

  • 好的,谢谢。这就是我正在考虑写的内容(加上从列表的开头和结尾删除),但我只是不确定为什么我的实现有效:/
猜你喜欢
  • 1970-01-01
  • 2016-04-10
  • 2020-05-23
  • 1970-01-01
  • 2013-11-10
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多