不完全确定为什么我的递归链表删除功能有效?会喜欢解释

时间:2017-10-18 22:01:56

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

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

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

让我们说我的链表是一个数字1,2,3,4,4,5的列表

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

  

现在这段代码有效,我认为不应该这样做,因为我从未将上一个节点连接到删除节点后的节点。

这是对的。您的功能似乎可以正常工作,但它确实显示出未定义行为的迹象。你需要使用:

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);
}