删除ll中的节点

时间:2017-10-19 05:55:16

标签: c++ linked-list

我正在尝试创建一个删除单链表中的值对的函数

即,如果列表是1-> 2-> 2-> 3-> 4-> nullptr,则它将是1-> 3-> 4-> nullptr和1->。 2-> 3-> 3-> 3-> 4-> nullptr将是1-> 2-> 3-> 4-> nullptr

这是我到目前为止所做的:

void remove_pairs_i (LN<T>*& l) {
for(LN<T> * x = l; x->next != nullptr; x=x->next)
{
 if(l == nullptr)
 {
    return;
 }
    if(x->value == x->next->value) {

        LN<T> *d1 = x;
        LN<T> *d2 = x->next;
        x = x->next->next; //point x to the node after the pair to be deleted

        delete d1;
        delete d2;
    }
}

}

然而,当我针对1-> 1-&gt; 2-&gt; 3-> nullptr测试功能时 我的程序以返回0结束,因此很难判断发生了什么,即使我手工模拟它。

1 个答案:

答案 0 :(得分:0)

您应该修改相等对之前的节点的下一个值。

在特殊情况下,当同等对位于列表的开头时,则应修改列表的头部。

void remove_pairs_i (LN<T>*& l)
{
    // If two first values are equal, the head of the list should be modified
    while (l && l->next && l->value == l->next->value)
    {
        LN<T> *d1 = l;
        LN<T> *d2 = l->next;
        l = l->next->next; //point l to the node after the pair to be deleted

        delete d1;
        delete d2;
    }

    // Rest of the list
    for(LN<T> * x = l; x && x->next && x->next->next; x = x->next)
    {
        if(x->next->value == x->next->next->value)
        {
            LN<T> *d1 = x->next;
            LN<T> *d2 = x->next->next;
            x->next = x->next->next->next; //point x->next to the node after the pair to be deleted

            delete d1;
            delete d2;
        }
    }
}