我正在尝试从链接列表中删除重复项,但我在代码中有一个错误,我无法弄清楚...所以似乎有一个逻辑错误,例如找到一个重复的节点,删除不正确?
ListNode *deleteDuplicates(ListNode *head) {
if (head == nullptr)
return head;
bool visited[255];
memset(visited, false, sizeof(visited));
ListNode * t = head;
ListNode *p = head;
while (t)
{
if (!visited[t->val])
{
visited[t->val] = true;
}
else{
ListNode *temp = t;
p->next = temp->next;
delete temp;
}
p = t;
t = t->next;
}
return head;
}
答案 0 :(得分:0)
您的代码调用未定义的行为。删除temp
指向的对象时,它会取消对象的内部字段,包括next
字段。由于t
指向与temp
相同的对象,t
的字段也会变为无效。因此,作业t = t->next
将产生不确定的结果。
答案 1 :(得分:0)
问题是当你找到一个副本时,你删除的temp实际上等于t。然后,当你打电话给t = t->next
时,你指的是一个删除的指针,这当然是非法的。
一个简单的解决方案是将while循环更改为:
while (t)
{
ListNode *temp = NULL; // added
if (!visited[t->val])
{
visited[t->val] = true;
}
else{
temp = t; // changed
p->next = temp->next;
// delete temp; // commented out (moved below)
}
p = t;
t = t->next;
if (temp) { // Added - delete temp folder in case it was set
delete temp;
}
}