我写了一个程序,它有效,但我认为不应该。有人可以解释它为什么有用吗?
我有一个单独的链表。这是一个项目所以我不能发布直接代码,但我会稍微改变问题
让我们说我的链表是一个数字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);
现在这段代码有效,我认为不应该因为我从未将上一个节点连接到删除节点后的节点。然而,当我查看结果时,所有正确的节点都被连接,并且所有应该删除的节点都被删除了。我在这里误解了什么吗? 指针=指针 - >下一步做的不仅仅是将指针指向下一个节点的地址吗?
谢谢!
答案 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);
}