给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点。即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留。同时,所有被删除的结点必须被保存在另外一个链表中。例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。
输入格式:
输入第一行包含链表第一个结点的地址、以及结点个数N(<= 105 的正整数)。结点地址是一个非负的5位整数,NULL指针用-1表示。
随后N行,每行按下列格式给出一个结点的信息:
Address Key Next
其中Address是结点的地址,Key是绝对值不超过104的整数,Next是下一个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除结点组成的链表。每个结点占一行,按输入的格式输出。
输入样例:00100 599999 -7 8765423854 -15 0000087654 15 -100000 -15 9999900100 21 23854输出样例:00100 21 2385423854 -15 9999999999 -7 -100000 -15 8765487654 15 -1#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <vector>#include <set>#include <stack>#include <map>#include <climits>using namespace std;#define LL long longconst int INF=0x3f3f3f3f;struct node{ int val; int nt;}a[100005];int vis[100005];int ans1[100005],ans2[100005];int main(){ int x,n; while(~scanf("%d %d",&x,&n)) { int k; for(int i=0;i<n;i++) { scanf("%d",&k); scanf("%d %d",&a[k].val,&a[k].nt); } int cnt1=0,cnt2=0; for(int i=x;i!=-1;i=a[i].nt) { int k=abs(a[i].val); if(!vis[k]) vis[k]=1,ans1[cnt1++]=i; else ans2[cnt2++]=i; } PRintf("%05d %d ",ans1[0],a[ans1[0]].val); for(int i=1;i<cnt1;i++) { printf("%05d/n",ans1[i]); printf("%05d %d ",ans1[i],a[ans1[i]].val); } printf("-1/n"); if(cnt2) { printf("%05d %d ",ans2[0],a[ans2[0]].val); for(int i=1; i<cnt2; i++) { printf("%05d/n",ans2[i]); printf("%05d %d ",ans2[i],a[ans2[i]].val); } printf("-1/n"); } } return 0;}
新闻热点
疑难解答