L2-002. 链表去重
2017-03-20 22:02
274 查看
L2-002. 链表去重
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一个带整数键值的单链表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 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
解题思路:用模拟的方法,重复的放到一个数组里,不重复的输出,注意控制格式。
解题代码:
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一个带整数键值的单链表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 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<iostream> #include<stdio.h> #include<math.h> #include<string.h> using namespace std; struct node { int key; int next; }ch[100010]; int sh[100010]; bool vis[100010]; //标记这个数是否已用过 int main() { int adress,n; scanf("%d%d",&adress,&n); memset(vis,true,sizeof(vis)); int max1=0; int c; for(int i=1;i<=n;i++)//利用数组下标表示这个数的地址 { scanf("%d",&c); scanf("%d%d",&ch[c].key,&ch[c].next); } printf("%05d %d",adress,ch[adress].key);//输出第一个数的地址及值 int l=fabs(ch[adress].key); vis[l]=false; int path=adress; while(true) { path=ch[path].next; if(path==-1) //如果此链表输出到最后 { printf(" -1\n"); break; } l=fabs(ch[path].key); if(vis[l]==true)//若出现第一次 { printf(" %05d\n%05d %d",path,path,ch[path].key); vis[l]=false; } else//若重复则输入到一个数组里 { sh[++max1]=path; } } if(max1!=0)//输出重复链表 { printf("%05d %d",sh[1],ch[sh[1]].key); for(int i=2;i<=max1;i++) printf(" %05d\n%05d %d",sh[i],sh[i],ch[sh[i]].key); printf(" -1\n"); } return 0; }
相关文章推荐
- L2-002. 链表去重 (模拟+空间换时间)
- L2-002. 链表去重 - 天梯赛练习题
- PAT L2-002. 链表去重 巧妙利用数组的索引
- L2-002. 链表去重
- PAT L2-002. 链表去重
- L2-002. 链表去重
- L2-002. 链表去重
- 团体程序设计天梯赛-练习集 L2-002. 链表去重
- 天梯赛习题 L2-002. 链表去重
- L2-002.链表去重
- PAT ~ L2-002. 链表去重 (思路 + 模拟)
- L2-002. 链表去重
- PAT L2-002. 链表去重 巧妙利用数组的索引
- PAT - 天梯赛 L2-002 链表去重
- PAT天梯赛 L2-002. 链表去重 【STL】
- L2-002. 链表去重
- L2-002. 链表去重
- 团体程序设计天梯赛-练习集L2-002. 链表去重
- L2-002. 链表去重
- L2-002. 链表去重