2017-10-18 88 views
0

我写了一个程序,它的工作原理,但我不认为它应该。有人可以解释为什么它的作品?不完全确定为什么我的递归链表删除函数的作品?会喜欢一个解释

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

比方说我的链表是数字1,2,3,4,4名单,5

我需要扫描列表并删除任何重复项,所以我需要删除其中的一个。我需要通过递归来完成。

我写的函数有它的参数/参数作为指针到列表的开始,我要给这个指针

//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

嗨,你能发表完整的代码吗?如果您遗漏了某些零件,我们无法确定您做了什么或不该做什么。 – Stefan

+0

如果你(*真*)想要一个单链表的数据结构,那么对于$ DEITY的爱,只需使用'std :: forward_list'并完成它。请。请不要重蹈覆辙。更好的是,使用'std :: vector';它可能在现实生活中或多或少总是会更好(不管算法的复杂程度如何等理论性的东西)。 –

+1

@JesperJuhl不幸的是,我必须这样做,因为任务规定。不是我的选择。 – Duxa

回答

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

是的,谢谢。这就是我正在考虑编写的内容(加上从列表的开头和结尾处移除),但我不确定为什么我的实现起作用:/ – Duxa

+0

@Duxa,欢迎您。 –

相关问题