考查点:静态链表
思路:自己用单链表的方法但是超时,需要转化为数组,而不是使用next遍历
提交情况:第一次少输了一个数没运行出来,之后忘记改next节点
收获:静态链表的题还是不要尝试改动next为好,尽量转为数组,通过加一个变量
ac代码:
思路:自己用单链表的方法但是超时,需要转化为数组,而不是使用next遍历
提交情况:第一次少输了一个数没运行出来,之后忘记改next节点
收获:静态链表的题还是不要尝试改动next为好,尽量转为数组,通过加一个变量
23分代码:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#define FOR(i, x, y) for(int i = x; i <= y; i++)
#define rFOR(i, x, y) for(int i = x; i >= y; i--)
#define MAXN 10005
#define oo 0x3f3f3f3f
using namespace std;
const int maxn=100010;
struct Link{
int data;
int add;
int next;
}node[maxn];
int h[10010];
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int first,n;
scanf("%d%d",&first,&n);
int add;
for(int i=0;i<n;i++){
scanf("%d",&add);
scanf("%d%d",&node[add].data,&node[add].next);
node[add].add=add;
}
int p=first;
int pre=first;
int q=-1;
int qq;
while(p!=-1){
int k=abs(node[p].data);
h[k]++;
if(h[k]>1){
if(q==-1)qq=p;
if(q!=-1)node[q].next=p;
node[pre].next=node[p].next;
q=p;
p=node[p].next;
}else{
pre=p;p=node[p].next;
}
}
node[q].next=-1;
p=first;
while(p!=-1){
if(node[p].next!=-1)printf("%05d %d %05d\n",p,node[p].data,node[p].next);
else printf("%05d %d -1\n",p,node[p].data);
p=node[p].next;
}
while(qq!=-1){
if(node[qq].next!=-1) printf("%05d %d %05d\n",qq,node[qq].data,node[qq].next);
else printf("%05d %d -1",qq,node[qq].data);
qq=node[qq].next;
}
return 0;
}
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
using namespace std;
const int maxn=100010;
struct Link{
int data;
int add,order;
int next;
}node[maxn];
int h[10010];
bool cmp(Link a,Link b){
return a.order<b.order;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int first,n,add;
for(int i=0;i<maxn;i++){
node[i].order=2*maxn;
}
scanf("%d%d",&first,&n);
for(int i=0;i<n;i++){
scanf("%d",&add);
scanf("%d%d",&node[add].data,&node[add].next);
node[add].add=add;
}
int cntv=0,cntr=0,p=first;
while(p!=-1){
if(h[abs(node[p].data)]==0){
h[abs(node[p].data)]++;
node[p].order=cntv++;
}else{
node[p].order=maxn+cntr++;
}
p=node[p].next;
}
sort(node,node+maxn,cmp);
int cnt=cntv+cntr;
for(int i=0;i<cnt;i++){
if(i!=cnt-1&&i!=cntv-1){
printf("%05d %d %05d\n",node[i].add,node[i].data,node[i+1].add);
}else{
printf("%05d %d -1\n",node[i].add,node[i].data);
}
}
return 0;
}