void delete_double (LN<T>*& l) {
if (l == nullptr)
return;
LN<T> *p = l;
while ( p -> next != nullptr && p -> next -> next != nullptr)
{
if (p -> value == p -> next -> value) // the current value is equal to the next value in the linked list
{
if (p == l) // when the first two values are the same // not sure if it is correct
{
l = l -> next -> next;
}
else // Problem should be here
{
LN<T> *to_delete = p; // Also tried this (doesn't work)
p = p->next;
delete to_delete; // LN<T>* to_delete = p;
// LN<T>* to_delete2 = p -> next;
LN<T> *to_delete1 = p; // l = to_delete2 -> next;
p = p->next; // delete to_delete;
delete to_delete1; // delete to_delete2;
}
}
else
{
p = p-> next;
}
}
}
// Image below is my output
在此输入图像描述
你好,我正在编写一个函数,如果两个值相同,它将删除链接列表中的一行中的两个值。当输入类似于“1 -> 2 -> 3 -> 3 -> 4 -> nullptr”时,我的代码似乎停止工作。(输出应该是 1 -> 2 -> 4 -> nullptr)。它退出时没有给我任何错误。我逐行进行了调试,它突然退出并显示“变量不可用”。
我猜测问题是当我删除p时,l指向垃圾,这导致了问题。所以我尝试了一种不同的方法让 l 指向 to_delete -> next。但它仍然不起作用。
我已经尝试了很多个小时来修复它,但调试甚至没有帮助。有人可以帮忙吗?太感谢了!
我已经简化了上面的代码,上面的逻辑也无法帮助您删除多个重复项。那么让我们看一下下面的代码并剖析它:
void delete_double(LN<T>*& l) {
if (l == nullptr)
return;
LN<T> *p = l;
LN<T> dummy(0);
dummy.next = l;
p = &dummy;
LN<T> *temp;
LN<T> *duplicate;
LN<T> *prev;
while (p != nullptr && p->next != nullptr)
{
temp = p;
while (p != nullptr && temp->next != nullptr)
{
if (p->value == temp->next->value)
{
duplicate = temp->next;
temp->next = temp->next->next;
delete duplicate;
duplicate = p;
prev->next = p->next;
p = prev;
delete duplicate;
temp = p;
}
else
{
break;
}
}
prev = p;
p = p->next;
}
l = dummy.next;
}
似乎在开始时需要一个虚拟节点,因为如果我们有 1 -> 1 -> 2,我们需要删除前两个并指向正确的头,即 2。为了避免这种混乱,最好要在开头和结尾保留虚拟节点,只需将列表的输出设置为 p = dummy.next,这是列表的实际开头。
我定义了一些临时的,temp
and duplicate
、 temp 来帮助我在列表中进一步导航并复制以保存重复值,将指针移动到下一个并删除该节点。prev
是指向重复项之前节点的前一个指针。
列表中的每个节点,temp = p
我向前移动,直到找到相邻的匹配项p->value == temp->next->value
如果存在匹配项,我将删除当前节点及其前面找到的节点。我用prev
跟踪器通过正确设置其来恢复列表的顺序next
,否则我会脱离内部循环并继续执行下一个值,即外部循环p = p->next
.
我不确定你的情况LN<T>
struct 所以我已经按照我的想法进行了。
演示链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)