从链表中删除副本



我已经编写了从链表中删除重复的代码,但我无法识别我的错误。如有任何建议或帮助,我将不胜感激。

#include <bits/stdc++.h>
using namespace std;
//Compiler version g++ 6.3.0
struct Node{
int data;
Node *next;
Node(int x){
data=x;
next=NULL;
}
};
void fun(Node *head){
Node *curr;
//Node *temp=curr->next;
//Node *prev;
Node *ptr;
for(curr=head;curr!=NULL;curr=curr->next){
for(ptr=curr;ptr!=NULL;ptr=ptr->next){
if(curr->data==ptr->data){
Node *hold=ptr->next;   //to hold duplicate
ptr->next=ptr->next->next;
delete(hold);
}
//cout<<curr->data<<endl;
}    
}
}
void print(Node *head){
Node *move=head;
while(move!=NULL){
cout<<move->data;
move=move->next;
}
}
int main()
{
int n,data1;
cin>>n;
cin>>data1;
Node *head=new Node(data1);
Node *temp=head;
while(n-1!=0){
int x;
cin>>x;
temp->next=new Node(x);
temp=temp->next;
n--;
}

fun(head);
print(head);
}

fun函数或调用fun函数中是否有错误?我认为这是可能的,但我不能弄清楚。

Node *hold=ptr->next;   //to hold duplicate
ptr->next=ptr->next->next;
delete(hold);

这里,你持有的是下一个ptr,它不是副本。Node *hold = ptr是重复的,但是因为你没有prev ptr,所以你不能删除这个重复的。

我认为主要的错误是在你原来的for循环中,你没有正确地遍历和处理链表中的节点。

我已经修复了你的for循环,它现在工作了。

此外,我已经用#include <iostream>删除了您的声明#include <bits/stdc++.h>using namespace std;。相反,我使用了std::instd::out

以下是不包含#include <bits/stdc++.h>using namespace std;的两个原因:

https://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h">

为什么使用命名空间std;"被认为是不好的做法?


下面是我的新代码:

#include <iostream>
//Compiler version g++ 6.3.0
struct Node{
int data;
Node *next;
Node(int x){
data=x;
next=NULL;
}
};
void fun(Node *head){
Node *curr;
//Node *temp=curr->next;
//Node *prev;
Node *ptr;
for(curr=head;curr!=NULL;curr=curr->next){

if (curr->next == NULL)
return;

for(ptr=curr->next;ptr!=NULL;ptr=ptr->next){
if(curr->data==ptr->data){
Node *hold=ptr;   //to hold duplicate
curr->next=ptr->next;
delete(hold);
}
else
break;

//cout<<curr->data<<endl;
}    
}
}
void print(Node *head){
Node *move=head;
while(move!=NULL){
std::cout<<move->data;
move=move->next;
}
}
int main()
{
int n,data1;
std::cin>>n;
std::cin>>data1;
Node *head=new Node(data1);
Node *temp=head;
while(n-1!=0){
int x;
std::cin>>x;
temp->next=new Node(x);
temp=temp->next;
n--;
}

fun(head);
print(head);
}

如果您在测试过程中遇到任何其他问题,请告诉我。但是,上面的代码适用于我的测试用例。

可能删除了错误的节点。if中的条件可以是这样的:

if(curr->data==ptr->next->data) {
//delete ptr->next,
}

因此,ptr->next应该在if之前检查。

相关内容

  • 没有找到相关文章

最新更新