L2-002. 链表去重

来源:互联网 发布:松下fpxh编程样列 编辑:程序博客网 时间:2024/05/29 10:33
//使用链表实现//c++链表去重问题,当前元素的前一个元素和尾指针指向当前元素,遍历结束条件为!=-1//本题注意tail=-1 就是设置尾节点的结束#include<iostream>#include<cstdio>#include<cstring> #include<cmath>using namespace std;int S,N;const int maxn=1e6+10;struct T{    int from,val,to;};T np[maxn];int vp[maxn];int star=1e6,head=1e6+1,tail;int main(){    cin>>S>>N;    int a,b,c;    np[star].to=S;    np[head].to=-1;    memset(vp,0,sizeof(vp));    for(int i=0;i<N;i++){        cin>>a>>b>>c;        np[a].from=a;        np[a].val=b;        np[a].to=c;    }    int u=star;    while(u!=-1&&np[u].to!=-1){        int u1=np[u].to;        if(vp[abs(np[u1].val)]){            np[u].to=np[u1].to;            if(np[head].to==-1)np[head].to=tail=u1;            else{                np[tail].to=u1;                tail=u1;            }        }        else{            vp[abs(np[u1].val)]=1;            u=np[u].to;        }    }    np[tail].to=-1;    int s1=star,s2=head;    while(np[s1].to!=-1){        int temp1=np[s1].to;        s1=np[s1].to;        printf("%05d %d ",np[temp1].from,np[temp1].val);        if(np[temp1].to!=-1)printf("%05d\n",np[temp1].to);        else printf("%d\n",np[temp1].to);    }    while(np[s2].to!=-1){        int temp1=np[s2].to;        s2=np[s2].to;        printf("%05d %d ",np[temp1].from,np[temp1].val);        if(np[temp1].to!=-1)printf("%05d\n",np[temp1].to);        else printf("%d\n",np[temp1].to);    }    return 0;} 
0 0