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. python代理池的构建1——代理IP类的构建,以及配置文件、日志文件、requests请求头

    一.整体结构 二.代理IP类的构建(domain.py文件) ''' 实现_ init_ 方法, 负责初始化,包含如下字段: ip: 代理的IP地址 port:代理IP的端口号 protocol: 代 ...

  2. [整理] LRU 算法的实现方式

    目录 概念 方法选择 实现方案(基于LinkedHashMap) 改进方案 1.LRU-K 2.Two queue 3.Multi Queue(MQ) LRU类算法对比 LRU 在 Redis 中的应 ...

  3. 关于TCP状态TIME_WAIT的理解

    1.TIME_WAIT的作用: TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器 ...

  4. leetcode28 strstr kmp bm sunday

    字符串匹配有KMP,BM,SUNDAY算法. 可见(https://leetcode-cn.com/problems/implement-strstr/solution/c5chong-jie-fa- ...

  5. leetcode 12 整数转罗马数字 贪心

    额,连着两个贪心? 这是局部最优问题:能用大"罗马数表示"就不会用小的. 先构造出所有基础罗马数,然后从大到小比较 因为比较的只有1000,900,...有限并有些麻烦,构造tab ...

  6. codeforces 1028C Rectangles【思维】

    题目:戳这里 题意:有n个矩阵,求一个点(保证存在)至少在n-1个点内. 解题思路:因为矩阵与坐标轴平行,所以我们画图可以发现如果存在点满足条件,则这些点中一定有一个是矩阵的顶点.我们可以把所有顶点的 ...

  7. DOM型XSS

    打开漏洞页面,随便输入点东西,发现没有啥东西. 但是我们发现我们输入的11,在面的herf 中 看到这儿就很简单了,我们只需要闭合一下,就可以构造出我们的payload了. '><img ...

  8. linux bash which

    linux bash which https://linuxize.com/post/linux-which-command/ Linux which command is used to ident ...

  9. Dva & Umi

    Dva & Umi Dva.js & Umi.js React & Redux https://dvajs.com/ React and redux based, lightw ...

  10. iframe 父子互传消息,父页面滚动,子页面触发父页面高度

    https://blog.csdn.net/qq_38366657/article/details/81538145 // 父页面的js<iframe id='TopHeader' src=&q ...