【问题标题】:Deleting nodes recursively递归删除节点
【发布时间】:2022-07-08 01:40:00
【问题描述】:

我创建了这个函数来递归地从双向链表中删除节点。这里的问题是,基于调用堆栈,它从第二个开始,所以它不会删除整个列表。我可以从我调用它的方法中删除剩余的节点,但应该有办法解决这个问题。有没有办法解决这个问题?

    void RecursiveClear(const Node* _curr) {
    if(_curr != nullptr) {
        //_curr->prev = _curr;
        _curr = _curr->next;
        RecursiveClear(_curr);
    }
    if (_curr != nullptr) {
        delete _curr;
    }
}

【问题讨论】:

  • 如果你不想从第二个节点开始,为什么你要做的第一件事就是将指针提前到第二个节点?它完全按照你的吩咐去做。如果你想让它做其他事情,然后告诉它做 that 代替。这可能是学习如何使用调试器的好时机,这样您就可以准确地看到和理解您的代码在做什么。
  • 好点没用。我会记住这一点。谢谢

标签: c++ linked-list doubly-linked-list


【解决方案1】:

第一:不要使用前导_

您在函数中修改_curr,因此当您最终到达delete 时,原始指针已消失。所以不要那样做,只需调用下一个值的函数而不修改本地 vbariable:

RecursiveClear(_curr->next);

您也不应该进行这样的递归,因为列表可能很长。您的代码不是尾递归的。列表中的每个节点都会占用一点堆栈空间。对于长列表,这会溢出堆栈并崩溃。

使用临时的,以便您可以将操作重新排序为尾递归:

void RecursiveClear(const Node* curr) {
   if (curr != nullptr) {
        const Node *next = curr->next;
        delete curr;
        RecursiveClear(next);
    }
}

【讨论】:

  • 感谢戈斯温。这很有意义。我必须做的唯一改变是 RecursiveClear(_curr->next) 到 RecursiveClear(_curr) 否则它不会做它应该做的。感谢您的快速回答。
  • 更好的选择是根本不使用递归,而是使用迭代循环,这样更安全,例如:void IterativeClear(const Node* curr) { while (curr != nullptr) { const Node *next = curr->next; delete curr; curr = next; } }
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多