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;
}

PAT-1133(Splitting A Linked List)vector的应用+链表+思维的更多相关文章

  1. PAT 1133 Splitting A Linked List[链表][简单]

    1133 Splitting A Linked List(25 分) Given a singly linked list, you are supposed to rearrange its ele ...

  2. PAT 1133 Splitting A Linked List

    Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...

  3. PAT A1133 Splitting A Linked List (25 分)——链表

    Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...

  4. 1133 Splitting A Linked List

    题意:把链表按规则调整,使小于0的先输出,然后输出键值在[0,k]的,最后输出键值大于k的. 思路:利用vector<Node> v,v1,v2,v3.遍历链表,把小于0的push到v1中 ...

  5. PAT A1133 Splitting A Linked List (25) [链表]

    题目 Given a singly linked list, you are supposed to rearrange its elements so that all the negative v ...

  6. PAT1133:Splitting A Linked List

    1133. Splitting A Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  7. PAT_A1133#Splitting A Linked List

    Source: PAT A1133 Splitting A Linked List (25 分) Description: Given a singly linked list, you are su ...

  8. PAT乙级真题及训练题 1025. 反转链表 (25)

    PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...

  9. PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)

    PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)   http://www.patest.cn/contests/pat-b-practise/1025 ...

随机推荐

  1. windows10上下载远程控制软件之后导致windows10亮度调节功能不能使用

    出现了通用即插即用监视器就可以了

  2. solidity的函数修改器(modifier)

    内容:modifier的定义.modifier对函数参数的操作.modifier执行的顺序 modifier的定义 官方文档:modifier可以改变函数的行为.可以被继承和重写. 其实modifie ...

  3. Interop.Word Documents.Open is null

    问题描述 程序在Windows Server 2012 R2调用Word组件正常,但是换到Windows Server 2008 R2之后,程序异常. 代码 Microsoft.Office.Inte ...

  4. CentOS 6 修改/etc/security/limits.conf不生效办法

    我们使用CentOS系统,在部署新的服务经常会遇到 打开最大文件数限制 too many open files的警告,通常我们只需要修改/etc/security/limits.conf该文件,增加两 ...

  5. 牛客网多校第4场 D Another Distinct Values 【构造】

    题目:戳这里 题意,n*n的矩阵,只能填-1,0,1,问能不能使该矩阵的任意行和列的和都不想等. 解题思路:戳这里 可以说是一目了然了 附ac代码: 1 #include<iostream> ...

  6. 线程同步之信号量(sem_init,sem_post,sem_wait)

    信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区. 不多做解释,要使用信号量同步,需要包含头文件semaphore.h. 主要用到的函数: int ...

  7. HDU 4335 What is N?(指数循环节)题解

    题意: 询问有多少数\(n\)满足\(n^{n!}\equiv b\mod p \land\ n\in[1,M]\),数据范围:\(M\leq2^{64}-1,p\leq1e5\) 思路: 这题显然要 ...

  8. springboot demo(二)web开发demo

    如入门般建立项目,引入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</g ...

  9. 【rocketmq学习笔记】rocketmq入门学习

    基本介绍 rocketmq是阿里巴巴团队使用java语言开发的一款基于发布订阅模型的分布式消息队列中间件,是一款低延迟,高可用,拥有海量消息堆积能力和灵活拓展性的消息队列. 特点 可以实现集群无单点故 ...

  10. free open movie API all in one

    free open movie API all in one movie API TMDb API The Movie Database https://www.themoviedb.org/docu ...