不确定为什么我的递归链表删除功能有效?想要一个解释

Not exactly sure why my recursive linked list deletion function works? Would love an explanation

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

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

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

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

我正在写的函数有它的 argument/parameter 作为指向列表开头的指针,我将调用这个 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 指向下一个节点的地址吗?

谢谢!

Now this code works, and I dont think it should because I never connect the previous node to the one after the node i delete.

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

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