>下面的程序用于从排序的单链表中删除重复项。该代码在联机 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;
}
编辑:可以看到位置被删除的指针立即被重新分配。因此,这里不可能有悬空的指针!
让我们举一个非常简单的例子,有一个双节点列表,例如
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
部分,继续无效取消引用。以此类推无穷大(或者你会崩溃(。