C++ 删除链接列表中的重复项
您好,我想从链表中删除重复项(0为空) 运行程序后的结果是:C++ 删除链接列表中的重复项,c++,linked-list,C++,Linked List,您好,我想从链表中删除重复项(0为空) 运行程序后的结果是: input: 1->2->2->4->2->6->0 outPut: 1->2->4->6->0 我错在哪里?请帮助我这是我解决您问题的方法: 1->2->6 重要提示:不允许节点对象的析构函数删除下一个和上一个指针后面的链接对象 对于您的输入示例,其结果是输出1->4->2->6->0。它并不是完全精确的顺序,您想要作为输出,但是每个数字在输出中只存在一
input: 1->2->2->4->2->6->0
outPut: 1->2->4->6->0
我错在哪里?请帮助我这是我解决您问题的方法:
1->2->6
重要提示:不允许节点对象的析构函数删除下一个和上一个指针后面的链接对象
对于您的输入示例,其结果是输出1->4->2->6->0
。它并不是完全精确的顺序,您想要作为输出,但是每个数字在输出中只存在一次。它只添加重复编号的最后一次。
我不知道,如果你使用C或C++,但是因为我更喜欢C++,我用代码中的NulLPTR替换了NULL。如果对象不在使用malloc或new创建的堆上,则可以删除删除操作。以下是我针对您的问题的解决方案:
1->2->6
重要提示:不允许节点对象的析构函数删除下一个和上一个指针后面的链接对象
对于您的输入示例,其结果是输出1->4->2->6->0
。它并不是完全精确的顺序,您想要作为输出,但是每个数字在输出中只存在一次。它只添加重复编号的最后一次。
我不知道,如果你使用C或C++,但是因为我更喜欢C++,我用代码中的NulLPTR替换了NULL。如果对象不在使用malloc或new创建的堆上,则可以删除删除操作。为删除的节点分配的内存在哪里?显示列表定义。例如,不清楚您是否定义了指向尾部节点的指针。您应该使用调试器,并在纸上可视化每个步骤,以便查看发生了什么。您有
cur
,它在搜索重复项的内部循环中不会改变,但是当您找到重复项时,您也有cur->next=prev->next
,这不可能是正确的。首先,您可能没有足够长的时间考虑这个问题。您想删除4
后面的2
,因为4
前面有一些2
。这意味着您需要比较非相邻节点。你注意到了吗。。。?我想你至少可以用两种方法来处理它:1。您可以浏览整个列表,对于仍在列表中的每个节点“c”,扫描所有剩余节点并删除与当前“c”相等的节点。这具有平方复杂性。2.或者首先对整个列表进行排序(此阶段具有对数线性复杂性),然后扫描并删除相邻的重复项(线性)。删除节点的分配内存在哪里?显示列表定义。例如,不清楚您是否定义了指向尾部节点的指针。您应该使用调试器,并在纸上可视化每个步骤,以便查看发生了什么。您有cur
,它在搜索重复项的内部循环中不会改变,但是当您找到重复项时,您也有cur->next=prev->next
,这不可能是正确的。首先,您可能没有足够长的时间考虑这个问题。您想删除4
后面的2
,因为4
前面有一些2
。这意味着您需要比较非相邻节点。你注意到了吗。。。?我想你至少可以用两种方法来处理它:1。您可以浏览整个列表,对于仍在列表中的每个节点“c”,扫描所有剩余节点并删除与当前“c”相等的节点。这具有平方复杂性。2.或者先对整个列表进行排序(此阶段具有对数线性复杂性),然后扫描并删除相邻的重复项(线性)。谢谢大家。今天早上我解决了我的问题。谢谢你们的帮助谢谢大家。今天早上我解决了我的问题。谢谢你的帮助
bool alreadyExist(Node head)
{
Node cur = head;
while(cur.next != nullptr)
{
if(cur.next->data == head.data) {
return true;
}
cur = *cur.next;
}
return false;
}
void RemoveDuplicates(Slist& l)
{
if (l.head == nullptr) {
return;
}
Node* head = l.head;
Node* curPtr = l.head->next;
while(curPtr != nullptr)
{
if(alreadyExist(*curPtr) == false)
{
head->next = curPtr;
head->next->prev = head;
head = head->next;
curPtr = curPtr->next;
}
else
{
Node* backup = curPtr;
curPtr = curPtr->next;
// delete duplicate elements from the heap,
// if the nodes were allocated with new, malloc or something else
// to avoid memory leak. Remove this, if no memory was allocated
delete backup;
}
}
}