修复逻辑从链表中删除重复项

时间:2015-04-11 11:22:23

标签: c++ algorithm

我正在尝试从链接列表中删除重复项,但我在代码中有一个错误,我无法弄清楚...所以似乎有一个逻辑错误,例如找到一个重复的节点,删除不正确?

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;
}

2 个答案:

答案 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;          
    }

}