void List::removeDup()
{
Node *after = NULL;
Node *dup = NULL;
curr = head;
while(curr->next != NULL)
{
after = curr->next; //node after current one
while(after != NULL)
{
if(curr->data == after->data) //if dup found
{
dup = after;
curr->next = after->next;
delete dup;
}
else
{
after = after->next;
}//if no dup found, advance after node
}
curr = curr->next; //advance curr node
}
}
此代码使用第一个节点并与其余节点进行比较以查找重复项。如果找到,则将其删除。我得到的错误是
释放的指针未分配。有谁知道这意味着什么?
任何帮助将不胜感激
答案 0 :(得分:2)
如果你在linux上尝试运行valgrind来查看内存中实际发生的事情
其次,您的代码存在问题: 如果找到重复内容,则会破坏链接列表
|当前| => |节点| => |节点| => |复制| => |下一页|
如果您发现重复,您的代码会使当前的下一个指向副本的下一个并且您将其全部打破
我认为您必须执行其他更简单的功能来删除列表中的1个元素,并在找到重复项时调用它
答案 1 :(得分:0)
我不太了解c ++,但我认为它是因为你永远不会分配dup。这可能会对您有所帮助:Deleting a pointer in C++
答案 2 :(得分:0)
我创造了这种简单而干净的方法。
我们的想法是检查当前节点的数据是否等于下一个节点的数据。
如果答案是肯定的,请跳过next one
并删除它(取消分配)。
如果给定位置没有重复,只需像往常一样解析链表(else
语句)。
Node* RemoveDuplicates(Node *head)
{
if (head == nullptr) return nullptr;
Node *curr = head;
Node *aux;
while (curr->next != nullptr) {
if (curr->data == curr->next->data) {
aux = curr->next->next;
delete curr->next;
curr->next = aux;
}
else {
curr = curr->next;
}
}
return head;
}
答案 3 :(得分:0)
我差不多做同样的操作:选择第一个,将它与以下项目进行比较,如果下面的任何项目重复,则断开其链接。等等...
这是我的实施:
template<typename T>
void LinkedList<T>::removeDuplicates() {
Node<T> * current = head;
while (current) {
Node<T> * forward_head = current->next;
Node<T> * forward_tail = current;
while (forward_head) {
if (forward_head->data == current->data) {
// duplicated item found.
forward_tail->next = forward_head->next;
}
else
forward_tail = forward_tail->next;
forward_head = forward_head->next;
}
current = current->next;
}
}
预期输出为:
去除前:2,2,2,3,3,1,1,3,8,3,2,4,4
去除后:2,3,1,8,4