链表去重和链表重排(数组模拟)

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]);
		}
	}
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值