C++ 删除链接列表中的重复项
此代码使用第一个节点,并与其余节点进行比较以查找重复的节点。如果找到,则会将其删除。我得到的错误是 未分配要释放的指针。有人知道这是什么意思吗C++ 删除链接列表中的重复项,c++,linked-list,duplicates,C++,Linked List,Duplicates,此代码使用第一个节点,并与其余节点进行比较以查找重复的节点。如果找到,则会将其删除。我得到的错误是 未分配要释放的指针。有人知道这是什么意思吗 任何帮助都会被赏识我不知道C++,但是我认为它是因为你从不分配DUP。这可能会对您有所帮助:如果您在linux上,请尝试运行valgrind以查看内存中实际发生了什么 其次,您的代码存在问题: 当你发现一个重复的,你打破你的链表 |当前|=>|节点|=>|节点|=>|重复|=>|下一步| 如果你发现了一个复制品,你的代码会使当前的下一个点指向复制品的下一
<>任何帮助都会被赏识我不知道C++,但是我认为它是因为你从不分配DUP。这可能会对您有所帮助:如果您在linux上,请尝试运行valgrind以查看内存中实际发生了什么 其次,您的代码存在问题: 当你发现一个重复的,你打破你的链表 |当前|=>|节点|=>|节点|=>|重复|=>|下一步| 如果你发现了一个复制品,你的代码会使当前的下一个点指向复制品的下一个点,然后你会破坏它
我认为您必须执行另一个更简单的函数来删除列表中的一个元素,并在发现重复元素时调用它。我创建了这个简单而干净的方法 其思想是检查当前节点的数据是否等于下一个节点的数据 如果答案是肯定的,则跳过下一个
并将其删除(取消分配)
如果给定位置没有重复项,只需像往常一样解析链表(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;
}
模板
void LinkedList::removeDuplicates(){
节点*电流=头部;
while(当前){
节点*前进\头=当前->下一步;
节点*向前\尾部=当前;
while(前进头){
if(正向头->数据==当前->数据){
//找到重复项。
前进尾翼->下一步=前进尾翼->下一步;
}
其他的
前进尾翼=前进尾翼->下一步;
前进头=前进头->下一步;
}
当前=当前->下一步;
}
}
预期产出为:
拆卸前:2,2,2,2,3,2,1,3,8,3,2,4,4
拆卸后:2、3、1、8、4
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;
}
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;
}
}