这道题本质上考察的是链表的删除 ,所以怎么去删除的思想很关键我们可以这样思考
//首先先建立起链表,由于是给出地址的链表,所以只能用静态链表,也就是模拟链表
// 其次我们怎去设置访问次数
//最后就是怎么去存储没被删除的,和被删除的
算法设计如下
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 去存储链表的地址这样保证把链表的地址串起来
这样只要通过容器的每一个地址去访问元素即可
注意由于链表删除后 指针域存储的不是原来的地址 因此我们要输出的是容器里的地址
完整代码如下
#includeusing 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 >idx>>data>>next; s[idx]=data; ne[idx]=next; } vector 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



