2019年-PTA模拟赛-L2-1 链表去重(一维数组模拟链表)
一维数组模拟链表
被删除的结点仍然在e数组中,因此记录一下被删除的结点的地址就可以找到其值
AcCode:
#include<bits/stdc++.h>
using namespace std;
int e[100010], ne[100010], vis[100010];
vector<int> delNode;
int main(){
int N, rootAdress;
cin >> rootAdress >> N;
while(N--){
int now, v, nx;
cin >> now >> v >> nx;
e[now] = v;
ne[now] = nx;
}
int pre; //记录上一个结点的地址
for(int i = rootAdress; i != -1; i = ne[i]){
if(!vis[abs(e[i])]){
vis[abs(e[i])] = true; //访问到,标记一下
pre = i;
}else{ //发现绝对值重复的结点
ne[pre] = ne[i]; //前一个结点指向后一个结点
delNode.push_back(i); //把被删除结点的地址添加到vector里
}
}
for(int i = rootAdress; i != -1; i = ne[i]){
if(ne[i] != -1)
printf("%05d %d %05d\n", i, e[i], ne[i]);
else
printf("%05d %d -1\n", i, e[i]);
}
if(delNode.size() > 0){ //如果有被删除的结点
for(int i = 0; i < delNode.size() - 1; i++){
printf("%05d %d %05d\n", delNode[i], e[delNode[i]], delNode[i + 1]);
}
printf("%05d %d -1", delNode[delNode.size() - 1], e[delNode[delNode.size() - 1]]); //单独输出最后一组被删除结点
}
return 0;
}