#include
#include
struct stemp
{
int data;
int next;
} x[100005];// 储存数据
int flag[10001]={0};//
int Read();
int abs(int x);
void Print(struct stemp list[],int head)
{
// printf("开始打印\n");
int p = head;
// int i=0;
while (p != -1)
{
if (list[p].next != -1)
printf("%05d %d %05d\n", p, list[p].data, list[p].next);
else
printf("%05d %d %d\n", p, list[p].data, list[p].next);
p = list[p].next;
// i++;
}
}
int main()
{
//读取
int head ,p,prev, headDel = -1,tailDel;
p=head=Read();
if (head == -1)
{
return 0;
}
//核心算法,空间复杂度为O(n)
prev=head;//记录上一个节点地址
while(p!=-1){
if(flag[abs(x[p].data)]){
if(headDel==-1){
headDel=p;
tailDel=p;//跟踪
}
else{
x[tailDel].next=p;
tailDel=p;
}//这一部分是对删除数据进行处理
x[prev].next=x[p].next;//对原来的数据进行处理
}
else{
flag[abs(x[p].data)]=1;//该数据已经被访问过
prev=p;
}
p=x[prev].next;
}
if(headDel!=-1)x[tailDel].next=-1;
//核心算法结束
Print(x,head);
// printf("测试\n");
Print(x,headDel);
}
int abs(int x){
return x>=0?x:-x;
}
int Read()
{
int head, n;
scanf("%d %d", &head, &n);
if (n == 0)
{
return -1;
}
int addr, data, next;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &addr, &data, &next);
x[addr].data = data;
x[addr].next = next;
}
return head;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)