L2-002 链表去重 (25分)

L2-002 链表去重

思路

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

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

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

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

#include <bits/stdc++.h>
#define endl '
'
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
",node[i].th,node[i].val,node[i+1].th);
        }else{
            printf("%05d %d -1
",node[i].th,node[i].val);
        }
    }

}
原文地址:https://www.cnblogs.com/waryan/p/13583935.html