题目大意:给出一个链表,对重复的元素(绝对值相同的),只保留第一个出现的,并将所以其余的重复按顺序形成一个新链表。
理解:用两个来存,一个存要的链表,一个存删除的结点
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000;
struct node
{
int data;
int start;
int next;
}a[100050];
bool cmp(node a,node b)
{
return abs(a.data)>abs(b.data);
} ///比较内容
int vis[maxn]={0};//设置一个标记数组目的是检测是否为重复的数
int main()
{
int begin,n;
cin>>begin>>n;
int i;
for(i=0;i<n;i++)
{
int x;
cin>>x;
a[x].start=x;
cin>>a[x].data>>a[x].next;
}
int cnt=0;
vector<node>xx1,xx2;//分别存 不含重复数的链表 删除掉节点的链表
while(begin!=-1)
{
if(vis[abs(a[begin].data)]==0)
{//如果之前没有读到过这个数 存到不含重复数的表
vis[abs(a[begin].data)]=1;
xx1.push_back(a[begin]);
}
else//读到过了 存到删除的表
xx2.push_back(a[begin]);
begin=a[begin].next;
}
sort(xx1.begin(),xx1.end(),cmp);//按绝对值大小排序
for(i=0;i<xx1.size();i++)
{//输出格式
if(i<xx1.size()-1)
printf("%05d %d %05d\n",xx1[i].start,xx1[i].data,xx1[i+1].start);
else
printf("%05d %d -1\n",xx1[i].start,xx1[i].data);
}
for(i=0;i<xx2.size();i++)
{
if(i<xx2.size()-1)
printf("%05d %d %05d\n",xx2[i].start,xx2[i].data,xx2[i+1].start);
else
printf("%05d %d -1\n",xx2[i].start,xx2[i].data);
}
return 0;
}
感觉写的很乱,还有两个点过不了
改不出来了,留着以后找吧也不想看别的题解了