L2-002 链表去重(利用数组)
输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1000000+5;
int wh1[N],wh2[N],dat[N],nex[N],vis[N];
void print(int place,int data,int nexplace)
{
    if(!place)
        printf("00000 ");
    else
        printf("%05d ",place);
    printf("%d ",data);
    if(!nexplace)
        printf("00000\n");
    else if(nexplace==-1)
        printf("-1\n");
    else
        printf("%05d\n",nexplace);
}
int main()
{
    int fir,n;
    scanf("%d%d",&fir,&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        dat[x]=y,nex[x]=z;//地址x的数据值,地址x的下一个地址
    }
    int dex=fir,cnt1=0,cnt2=0;
    while(dex!=-1)//wh[i]链表的第i个节点的地址  初始链表有序化并造出新顺序的链表
    {
        if(!vis[abs(dat[dex])])
        {
            vis[abs(dat[dex])]=1;
            wh1[++cnt1]=dex;//旧链表
        }
        else
            wh2[++cnt2]=dex;//新链表
        dex=nex[dex];
    }
    dex=fir;
    for(int i=1;i<cnt1;i++)
        print(wh1[i],dat[wh1[i]],wh1[i+1]);
    if(cnt1>0)
        print(wh1[cnt1],dat[wh1[cnt1]],-1);
    for(int i=1;i<cnt2;i++)
        print(wh2[i],dat[wh2[i]],wh2[i+1]);
    if(cnt2>0)
        print(wh2[cnt2],dat[wh2[cnt2]],-1);
}

相关文章: