您的位置:首页 > 其它

PAT L2-002. 链表去重 巧妙利用数组的索引

2018-03-23 20:21 204 查看
给定一个带整数键值的单链表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
思路:此题目理解起来不难,关键是模拟,如何判断第一个键值是否被访问呢?  flag[abs(a[s].key)],是第一次访问的存入一个数组,不是则存入另一个数组,存入的仅为索引,从始至终,这份代码都只利用刚开始结构体的索引来解决,第一次见到题目我还以为要用set来构造#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=1e5+5;
struct node
{
int inext;
int key;
}a
;//数组的索引即为Address
int ex
;
int de
;
int flag
;

int main()
{
int s,n,p;
int exi=0,del=0;
cin>>s>>n;
for(int i=1;i<=n;i++){
cin>>p;
cin>>a[p].key>>a[p].inext;
}
memset(flag,0,sizeof(flag));
for(int i=0;i<n&&s!=-1;i++){
if(!flag[abs(a[s].key)]){ //查询键值是否为第一次访问
ex[exi++]=s;
flag[abs(a[s].key)]=1;
s=a[s].inext;
}else
{
de[del++]=s;
s=a[s].inext;
}
}
if(exi){
for(int i=0;i<exi;i++){
if(i==0){
printf("%05d %d",ex[i],a[ex[i]].key);
}
else{
printf(" %05d\n%05d %d",ex[i],ex[i],a[ex[i]].key);
}
}
printf(" -1\n"); //最后的-1 表示
}
if(del){
for(int i=0;i<del;i++){
if(i==0){
printf("%05d %d",de[i],a[de[i]].key);
}
else{
printf(" %05d\n%05d %d",de[i],de[i],a[de[i]].key);
}
}
printf(" -1\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: