这道题本质上考察的是链表的删除 ,所以怎么去删除的思想很关键我们可以这样思考
//首先先建立起链表,由于是给出地址的链表,所以只能用静态链表,也就是模拟链表
// 其次我们怎去设置访问次数
//最后就是怎么去存储没被删除的,和被删除的
算法设计如下
Define N 100010
Int visit[N]
Scanf(addition,n)
For i to n
{
Scanf{idx}
S[Idx]=data;
Ne[Idx]=next;
}
For j<-addition to -1
{
If(访问过)进入数组1
else
{
Visit[j]<-1;
进入数组2
}
依次打印即可
}
容器我们可以建立一个vector 去存储链表的地址这样保证把链表的地址串起来
这样只要通过容器的每一个地址去访问元素即可
注意由于链表删除后 指针域存储的不是原来的地址 因此我们要输出的是容器里的地址
完整代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int s[N],ne[N];//数据域,指针
int idx;
int visit[N];//用来标记已经访问过的元素
int n,add;
int main()
{
cin>>add>>n;//利用模拟链表进行插入
for(int i=0;i<n;i++)
{
int data,next;
cin>>idx>>data>>next;
s[idx]=data;
ne[idx]=next;
}
vector<int>a,b;
for(int i=add;~i;i=ne[i])
{
int v=fabs(s[i]);
if(visit[v])a.push_back(i);
else
{
visit[v]=1;
b.push_back(i);
}
}
for(int i=0;i<b.size();i++)
{
printf("%05d %d ",b[i],s[b[i]]);
if(i==b.size()-1)cout<<"-1"<<endl;
else printf("%05d\n",b[i+1]);
}
for(int i=0;i<a.size();i++)
{
printf("%05d %d ",a[i],s[a[i]]);
if(i==a.size()-1)cout<<"-1"<<endl;
else printf("%05d\n",a[i+1]);
}
return 0;
}