PAT-1133(Splitting A Linked List)vector的应用+链表+思维
Splitting A Linked List
PAT-1133
- 本题一开始我是完全按照构建链表的数据结构来模拟的,后来发现可以完全使用两个vector来解决
- 一个重要的性质就是位置是相对不变的。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
using namespace std;
const int maxn=100005;
struct Node{
int address,data,next;
int trnext;//下一节点
// int trpre;//父节点
Node(){}
Node(int a,int b,int c):address(a),data(b),next(c){}
};
Node node[maxn];
map<int,int>ma;
int main(){
int start,n,k;
cin>>start>>n>>k;
for(int i=0;i<n;i++){
int address,data,next;
cin>>address>>data>>next;
ma[address]=i;
node[i]=Node(address,data,next);
if(address==start){
start=i;
}
}
for(int i=0;i<n;i++){
int next=node[i].next;
int trnext;
if(next==-1)
trnext=-1;
else trnext=ma[next];
node[i].trnext=trnext;
}
int neg=-1;//指向当前待插入的负数节点
int now=start;//当前节点
int pre=-1;//前驱结点
for(int next=start;next!=-1;){
int data=node[next].data;
now=next;
next=node[next].trnext;
if(data<0){
if(neg==-1&&pre==-1){//第一个出现的负节点 和头结点
pre=now;
neg=now;
}else if(neg==-1){
node[pre].trnext=next;
node[now].trnext=start;
start=now;
neg=start;//第一个 非head的负节点
//pre不变
}else{
node[pre].trnext=next;
node[now].trnext=node[neg].trnext;
node[neg].trnext=now;
neg=now;
}
}else{
pre=now;
}
}
//所有在0-k之间的数必须出现在大于k的数之前
pre=neg;
int next;
if(neg==-1){
next=start;
}else next=node[neg].trnext;
for(;next!=-1;){
int data=node[next].data;
now=next;
next=node[next].trnext;
if(data<=k&&data>=0){
if(neg==-1&&pre==-1){//第一个出现的负节点 和头结点
pre=now;
neg=now;
}else if(neg==-1){//表示没有负数节点
node[pre].trnext=next;
node[now].trnext=start;
start=now;
neg=now;//第一个 非head的负节点
//pre不变
}else{
node[pre].trnext=next;
node[now].trnext=node[neg].trnext;
node[neg].trnext=now;
neg=now;
}
}else{
pre=now;
}
}
for(now=start;now!=-1;now=node[now].trnext){
int a=node[now].address;
int b=node[now].data;
int c=node[now].trnext;
if(c!=-1){
c=node[c].address;
}
if(c!=-1){
printf("%05d %d %05d\n",a,b,c);
}else{
printf("%05d %d %d\n",a,b,c);
}
// cout<<node[now].address<<" "<<node[now].data<<" "<<node[node[now].trnext].address<<endl;
}
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
struct node{
int id,data,next;
};
int main(){
int begin, n, k, s, d, e;
cin>>begin>>n>>k;
node a[100010];
vector<node> v,ans;
for(int i=0;i<n;i++){
scanf("%d%d%d\n",&s,&d,&e);
a[s]={s,d,e};
}
for(;begin!=-1;begin=a[begin].next){
v.push_back(a[begin]);
}
for(int i=0;i<v.size();i++){
if(v[i].data<0)ans.push_back(v[i]);
}
for(int i=0;i<v.size();i++){
if(v[i].data>=0 && v[i].data<=k)ans.push_back(v[i]);
}
for(int i=0;i<v.size();i++){
if(v[i].data>k)ans.push_back(v[i]);
}
for(int i=0;i<ans.size();i++){
if(i!=ans.size()-1)printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id);
else printf("%05d %d -1",ans[i].id,ans[i].data);
}
return 0;
}
Either Excellent or Rusty
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了