已AC,具体过程看注释。

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
typedef struct node
{
    int pre;
    int data;
    int next;
    int flag;//标记 0-100000为保留的 100000-200000为需要删除的 
}Node;
bool cmp(Node a,Node b)
{
    return a.flag<b.flag;
}
int main()
{
    Node que[100000];
    map<int,int>M; 
    int begin,n,a,i,j,cnt,cnt1=0,cnt2=0;
    cin>>begin>>n;
    for (i=0;i<100000;i++)
    que[i].flag=200000;
    //定义100000个结构体,将头节点的值与头节点一一对应 
    for (i=0;i<n;i++)
    {
        cin>>a;
        cin>>que[a].data>>que[a].next;
        que[a].pre=a;
    }
    //从链表头部开始遍历链表 
    for (i=begin;i!=-1;i=que[i].next)
    {
        //如果之前出现过,他的flag >= 100000; 
        if (M[abs(que[i].data)]==1)
        que[i].flag=100000 + cnt2++;
        else
        {
            M[abs(que[i].data)]=1;
            que[i].flag=cnt1++;
        }
    }
    sort(que,que+100000,cmp);
    cnt=cnt1+cnt2;
    for (i=0;i<cnt;i++)
    {
        //判断是否到达边界 
        if (i!=cnt-1&&i!=cnt1-1)
        printf("%05d %d %05d\n",que[i].pre,que[i].data,que[i+1].pre);
        else
        printf("%05d %d -1\n",que[i].pre,que[i].data);
    }
}