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;
}
posted @ 2025-03-09 22:49  Yuhhhhh  阅读(9)  评论(0)    收藏  举报