以下程序用于从已排序的单链表中删除重复项。代码在在线IDE中提供垃圾值。但是当我评论这条线时。
delete curr;
该程序在线IDE本身运行良好。这是我写的功能。代码的其他部分由在线法官明确定义(不是由我)。
此外,没有注释删除curr; 行的代码在本地IDE(代码块)中运行良好。
完整计划: http://ideone.com/9bHab0
为什么我会得到垃圾值?
Node *removeDuplicates(Node *root)
{
// your code goes here
struct Node* curr = root,*prev = NULL;
while(curr)
{
if(prev==NULL)
prev = curr;
else if(curr->data!=prev->data)
prev = curr;
else
{
prev->next = curr->next;
delete curr;
curr = prev->next;
}
}
return root;
}
编辑:可以看到删除位置的指针,立即重新分配。因此,这里不可能是悬空指针!
答案 0 :(得分:4)
让我们举一个非常简单的例子,有一个双节点列表,例如,你可以使用
node1 -> node2
通过第一次迭代,prev
为NULL
,因此您执行prev = curr
。现在curr
和prev
指向同一节点。
这意味着在第二次迭代中,if
条件都是假的(prev != NULL
和curr->data == prev->data
)你进入else
部分,你有
prev->next = curr->next;
delete curr;
curr = prev->next;
您delete curr
但是 curr
指向与prev
相同的内存,导致未定义的行为在作业curr = prev->next
中,因为您现在取消引用迷路指针prev
。
更糟糕的是,然后输入第三个迭代,其中prev
仍然指向已删除的第一个节点,并再次取消引用无效的prev
指针(在您的指针中)第二个if
条件),您再次进入else
部分,继续无效解除引用。等等无穷大(或者你遇到了崩溃)。