1.链表重排
先用一个结构体来模拟链表的形式,一个存储数据,一个存储下一个的地址,用来存储数据
struct node{
int data;
int next;
};
node sum[200000];
然后定义两个数组,一个代表重排前的,一个代表重排后的
,将结构体数组中的元素放入数组一中,之后按题目要求重排即可
int add1[200000];//重排前链表
int add2[200000];//重排后链表
while(u!=-1){//u代表起始节点的地址
add1[k++]=u;
u=sum[u].next;
}
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
int next;
};
node sum[200000];
int add1[200000];//重排前链表
int add2[200000];//重排后链表
int main(){
int a,b,c;
int u;
int n;
scanf("%d %d ",&u,&n);
for(int i=0;i<n;i++){
scanf("%d %d %d",&a,&b,&c);
sum[a].data=b;
sum[a].next=c;
}
int k=0;
while(u!=-1){
add1[k++]=u;
u=sum[u].next;
}
int length=k;
k=0;
for(int i=0,j=length-1;i<=j;){//左边小于等于右边
if(i==j){
add2[k]=add1[i++];
}
else{
add2[k++]=add1[j--];//先尾部后头部
add2[k++]=add1[i++];
}
}
for(int i=0;i<length-1;i++){
printf("%05d %d %05d\n",add2[i],sum[add2[i]].data,add2[i+1]);//输出链表里的
}
printf("%05d %d -1\n",add2[length-1],sum[add2[length-1]].data);
}
2.链表去重
还是用一个结构体来模拟链表
struct node{
int data;
int next;
};
node sum[200000];
由于要纪录去重后的元素,所以开三个数组
int nextid[200000];//存放去重后的链表元素
int nextid1[200000];//存放去掉的链表元素
int visit[200000];//记录是否重复
把链表里所有的元素由结构体数组转到next数组里
while(h1!=-1){
if(visit[abs(sum[h1].num)]){
nextid1[r1++]=h1;//把h1放进来
nextid1[r1]=-1;//一个标记,便于后面输出
h1=sum[h1].nextid;//继续
}
else if(!visit[abs(sum[h1].num)]){//一定是else if,不然h1可能同时 nextid和nextid1里
visit[abs(sum[h1].num)]=1;//标记这个数已经有了
nextid[r2++]=h1;//放入h1
nextid[r2]=-1;// 一个标记,便于后面输出
h1=sum[h1].nextid;//下一个
}
}
代码
#include<bits/stdc++.h>
using namespace std;
int nextid[200000];//存放去重后的链表元素
int nextid1[200000];//存放去掉的链表元素
int visit[200000];//记录是否重复
struct node{
int num;//值
int nextid;//下一个的地址
};
int r1,r2;
node sum[200000];
int main(){
int h1;
int n;
cin>>h1;//起始节点
cin>>n;
for(int i=1;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
sum[a].num=b;
sum[a].nextid=c;
}
while(h1!=-1){
if(visit[abs(sum[h1].num)]){
nextid1[r1++]=h1;//把h1放进来
nextid1[r1]=-1;//一个标记,便于后面输出
h1=sum[h1].nextid;//继续
}
else if(!visit[abs(sum[h1].num)]){//一定是else if,不然h1可能同时 nextid和nextid1里
visit[abs(sum[h1].num)]=1;//标记这个数已经有了
nextid[r2++]=h1;//放入h1
nextid[r2]=-1;// 一个标记,便于后面输出
h1=sum[h1].nextid;//下一个
}
}
for(int i=0;i<r2;i++){
if(nextid[i+1]!=-1){
printf("%05d %d %05d\n",nextid[i],sum[nextid[i]].num,nextid[i+1]);//是nextid[i+1],链表连的是这个数组里的下一个
}
else{//如果是空地址就不用填充五位了
printf("%05d %d %d\n",nextid[i],sum[nextid[i]].num,nextid[i+1]);
}
}
for(int i=0;i<r1;i++){
if(nextid1[i+1]!=-1){
printf("%05d %d %05d\n",nextid1[i],sum[nextid1[i]].num,nextid1[i+1]);
}
else{
printf("%05d %d %d\n",nextid1[i],sum[nextid1[i]].num,nextid1[i+1]);
}
}
}