我正在尝试创建一个删除单链表中的值对的函数
即,如果列表是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结束,因此很难判断发生了什么,即使我手工模拟它。
答案 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;
}
}
}