L2-002 链表去重 (25分)

L2-002 链表去重

思路

为了将删除的和未删除的分开我们给他们赋权\(node[i].key\),然后按权值排序后即为所求。

然后在存储链式结构的时候可以采取类似于链式前向星的方法,

\[next存储下一个节点位置的地址\\th意为this存储这个位置的地址\\val则为边权 \]

这里改了的是结构体的\(node[i]\)即为存储地址,然后去标记访问遍历模拟就可以了。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

int head,n;
const int maxn=1e5;

int vis[100010];

struct node{
    int val,next,key,th;
    bool operator <(const node x)const{
        return key<x.key;
    }

}node[100010];

int main(){
    scanf("%d%d",&head,&n);
    for(int i=0;i<maxn+5;++i)node[i].key=maxn*2;
    for(int i=0;i<n;++i){
        int a;scanf("%d",&a);
        scanf("%d%d",&node[a].val,&node[a].next);
        node[a].th=a;
    }
    int cnt1=0,cnt2=0;
    for(int i=head;i!=-1;i=node[i].next){
        if(vis[abs(node[i].val)]){
            node[i].key=maxn+(++cnt1);
        }else{
            vis[abs(node[i].val)]=1;
            node[i].key=++cnt2;
        }
    }
    sort(node,node+maxn+1);
    int cnt=cnt1+cnt2;
    for(int i=0;i<cnt;++i){
        if(i!=cnt2-1&&i!=cnt-1){
            printf("%05d %d %05d\n",node[i].th,node[i].val,node[i+1].th);
        }else{
            printf("%05d %d -1\n",node[i].th,node[i].val);
        }
    }

}
posted @ 2020-08-29 23:15  waryan  阅读(164)  评论(0编辑  收藏  举报