PAT1133 Splitting A Linked List(模拟题)

该博客讨论了一种将链表元素按特定规则重新排列的方法,即分为小于0、0到K、大于K三部分,并保持原有顺序。文章通过代码实现展示了如何使用结构体数组和动态数组来处理链表,强调了选择合适数据结构的重要性,特别是利用一句高效代码完成链表元素的遍历和存储。
摘要由CSDN通过智能技术生成

原题

在这里插入图片描述

题目大意及思路

将链表元素以三个部分进行重新排列:
小于0的元素 【0,K】 大于K的元素
每个部分内部以原序列进行排列。
这里我们使用一个node结构体数组存储,通过下标可以直接找到对应node。
首先用一个动态数组存储初始排列,通过三部分分别遍历并存入ans动态数组中,再输出ans动态数组元素。

代码

#include<iostream>
#include<vector>
using namespace std;
struct node{
	int add,value,next;
};
int main(){
	int firstadd,n,k;
	cin>>firstadd>>n>>k;
	node a[100010];
	vector<node> data,ans;
	for(int i=0;i<n;i++){
		int ad,v,n;
		cin>>ad>>v>>n;
		a[ad]={ad,v,n};
	}
	for(;firstadd!=-1;firstadd=a[firstadd].next) data.push_back(a[firstadd]);
	for(int i=0;i<data.size();i++) if(data[i].value<0) ans.push_back(data[i]);
	for(int i=0;i<data.size();i++) if(data[i].value>=0&&data[i].value<=k) ans.push_back(data[i]);
	for(int i=0;i<data.size();i++) if(data[i].value>k) ans.push_back(data[i]);
	for(int i=0;i<ans.size()-1;i++) printf("%05d %d %05d\n",ans[i].add,ans[i].value,ans[i+1].add);
	printf("%05d %d -1\n",ans[ans.size()-1].add,ans[ans.size()-1].value);
	return 0;
}

运行截图

在这里插入图片描述

收获

  • 选择合适的数据结构很重要
  • 特别好的一句代码:for(;firstadd!=-1;firstadd=a[firstadd].next) data.push_back(a[firstadd]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值