【问题标题】:removing duplicates in a linked list删除链表中的重复项
【发布时间】:2014-03-16 03:06:52
【问题描述】:
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
}
}
此代码使用第一个节点并与其余节点进行比较以查找重复项。如果找到,则将其删除。我得到的错误是
被释放的指针未被分配。有谁知道这是什么意思?
任何帮助将不胜感激
【问题讨论】:
标签:
c++
linked-list
duplicates
【解决方案1】:
如果您使用的是 linux,请尝试运行 valgrind 以查看内存中实际发生的情况
其次,您的代码有问题:
当您找到重复项时,您会破坏您的链表
|当前| => |节点| => |节点| => |重复| => |下一个|
如果您发现重复,您的代码会将当前的下一个指向重复的下一个,然后您将其全部破坏
我认为您必须执行其他更简单的功能来删除列表中的 1 个元素并在找到重复项时调用它
【解决方案2】:
我创建了这个简单而干净的方法。
这个想法是检查当前节点的数据是否等于下一个节点的数据。
如果答案是肯定的,请跳过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;
}
【解决方案4】:
我几乎在做同样的操作:选择第一个,将其与以下项目进行比较,如果任何以下项目重复,则断开其链接。等等……
这是我的实现:
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、2、3、2、1、3、8、3、2、4、4
删除后:2、3、1、8、4