PS:刷题时的代码,基本没有改过,测试点都通过了。放上来总结一下思路与方法。
1.题目阐述
分裂链表,求出绝对值去重后的链表数据以及重复数据构成的链表
2.题目思路
这里强行全程用链表很复杂,我这里是先构造静态链表,再作节点循环分离出两个vector表来分别存储绝对值去重后的数据以及重复数据构成的数据,注意也要记录他们的地址数据用来最后输出的。
其他要注意的就是输出格式把。
3.题解代码
我的代码如下:
#include<cstdio>
#include<set>
using namespace std;
#include<algorithm>
#include<vector>
set<int> dup_set;
int set_start, dup_start = -1;
int N;
struct node{
int data;
int next;
int address;
}Node[100001];
vector<node> set_v,dup_v;
void Test1097(){
scanf("%d %d", &set_start, &N);
int s, x, e;
for (int i = 0; i < N; i++){
scanf("%d %d %d", &s, &x, &e);
Node[s].data = x;
Node[s].next = e;
Node[s].address=s;
}
int cur_node=set_start;
while(cur_node !=-1){
int temp=abs(Node[cur_node].data);
//重复元素加入集合
if(dup_set.find(temp)!=dup_set.end()){
dup_v.push_back(Node[cur_node]);
}else{
dup_set.insert(temp);
set_v.push_back(Node[cur_node]);
}
cur_node=Node[cur_node].next;
}
for(int i=0;i<set_v.size();i++){
if(i!=set_v.size()-1){
printf("%05d %d %05d\n",set_v[i].address,set_v[i].data,set_v[i+1].address);
}else{
printf("%05d %d -1\n",set_v[i].address,set_v[i].data);
}
}
for(int i=0;i<dup_v.size();i++){
if(i!=dup_v.size()-1){
printf("%05d %d %05d\n",dup_v[i].address,dup_v[i].data,dup_v[i+1].address);
}else{
printf("%05d %d -1\n",dup_v[i].address,dup_v[i].data);
}
}
}
int main(){
Test1097();
return 0;
}