1097 Deduplication on a Linked List

1097 Deduplication on a Linked List1097 Deduplication on a Linked List

题目大意:

给你一个链表。只保留第一个出现的且节点键值的绝对值不重复的节点(比如15——(-15)只保留15,-15删除),被删除的节点依次构建一个新链表。最后输出删除后得到的链表和被删除节点组成的新链表。

解题思路:

想了一种投机取巧的方法,就是用动态数组保存节点,被删除的节点放在一个新的数组中,这样无需构建链表和操作指针,非常容易理解。
代码如下:

#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
struct lis1//保存输入的链表节点
{
  int adde,key;
}node[100010];
struct lis2//动态数组类型
{
  int add,key;
};
int book[10010];
int main()
{
//  std::ios::sync_with_stdio(false);
//  cin.tie(0);
//  freopen("test.txt","r",stdin);
//  freopen("output.txt","w",stdout);
 int address,n;
 scanf("%d %d",&address,&n);
 for(int i=0;i<n;i++)
 {
   int t1,t2,t3;
   scanf("%d %d %d",&t1,&t2,&t3);
   node[t1].key=t2;node[t1].adde=t3;
 }
 vector<lis2> v1,v2;
 int tmp1=address;
 while(tmp1!=-1)
 {
   lis2 tes1;
   tes1.add=tmp1;tes1.key=node[tmp1].key;
   if(book[abs(tes1.key)]==0)//第一次出现放入v1
   {
     v1.push_back(tes1);
     book[abs(tes1.key)]=1;
   }
   else v2.push_back(tes1);//重复节点(被删除节点)放入v2
   tmp1=node[tmp1].adde;
 }
 int len1=v1.size(),len2=v2.size();//这里不替换还不行,有一个测试点始终报段错误(讲个笑话牛客网上的我过了)
 for(int i=0;i<len1-1;i++)
 {
   printf("%05d %d %05d\n",v1[i].add,v1[i].key,v1[i+1].add);
 }
 printf("%05d %d -1\n",v1[len1-1].add,v1[len1-1].key);
 for(int i=0;i<len2-1;i++)
 {
   printf("%05d %d %05d\n",v2[i].add,v2[i].key,v2[i+1].add);
 }
 if(len2>=1) printf("%05d %d -1\n",v2[len2-1].add,v2[len2-1].key);
 return 0;
}

一开始在输出哪里我把长度函数带入了,没有用变量替换,然后在PTA平台上始终有个2分测试点反馈段错误。。害我改了半天,可是牛客网上同一道题却AC了。emmmm,程序人生要佛系一点。