PAT A1133 Splitting A Linked List (25) [链表]
题目
Given a singly linked list, you are supposed to rearrange its elements so that all the negative values appear before all of the non-negatives, and all the values in [0, K] appear before all those greater than K. The order of the elements inside each class must not be changed. For example, given the list being 18→7→-4→0→5→-6→10→11→-2 and K being 10, you must output -4→-6→-2→7→0→5→10→18→11.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=1000). The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1. Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is an integer in [-105, 105], and Next is the position of the next node. It is guaranteed that the list is not empty.
Output Specification:
For each case, output in order (from beginning to the end of the list) the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218
Sample Output:
33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1
题目分析
已知N个结点,将值为负数的结点放置在非负节点之前,将小于等于k的结点放置在大于k的结点之前
解题思路
思路 01
- 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
- 依次遍历链表中结点
2.1 如果结点值<0,结点序号设置为cnt1++
2.2 如果结点值>=0&&<=k,结点序号设置为maxn+cnt2++
2.3 如果结点值>k,结点序号设置为2*maxn+cnt3++ - 按照order排序,并依次打印
思路 02
- 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
- 依次遍历链表中结点
2.1 依次遍历链表中结点,找到所有值<0的节点,存放于vector
2.2 依次遍历链表中结点,找到所有值>=0&&<=k的节点,存放于vector
2.3 依次遍历链表中结点,找到所有值>k的节点,存放于vector - 依次打印vector中结点
易错点
已知结点中存在无效结点(即不在链表中的结点)
Code
Code 01(最优)
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct node {
int adr;
int data;
int next;
int order=3*maxn;
} nds[maxn];
bool cmp(node &n1,node &n2) {
return n1.order<n2.order;
}
int main(int argc,char * argv[]) {
int hadr,n,k,adr;
scanf("%d %d %d",&hadr,&n,&k);
for(int i=0; i<n; i++) {
scanf("%d",&adr);
scanf("%d %d",&nds[adr].data,&nds[adr].next);
nds[adr].adr=adr;
}
int cnt1=0,cnt2=0,cnt3=0;
for(int i=hadr; i!=-1; i=nds[i].next) {
if(nds[i].data<0)nds[i].order=cnt1++;
if(nds[i].data>=0&&nds[i].data<=k)nds[i].order=maxn+cnt2++;
if(nds[i].data>k)nds[i].order=2*maxn+cnt3++;
}
sort(nds,nds+maxn,cmp);
int cnt=cnt1+cnt2+cnt3;
for(int i=0; i<cnt-1; i++) {
printf("%05d %d %05d\n",nds[i].adr,nds[i].data,nds[i+1].adr);
}
printf("%05d %d -1\n",nds[cnt-1].adr,nds[cnt-1].data);
return 0;
}
Code 02
#include <iostream>
#include <vector>
using namespace std;
const int maxn=100010;
struct node {
int adr;
int data;
int next;
} nds[maxn];
int main(int argc,char * argv[]) {
int hadr,n,k,adr;
scanf("%d %d %d",&hadr,&n,&k);
for(int i=0; i<n; i++) {
scanf("%d",&adr);
scanf("%d %d",&nds[adr].data,&nds[adr].next);
nds[adr].adr=adr;
}
vector<node> v,ans;
for(int i=hadr; i!=-1; i=nds[i].next) {
v.push_back(nds[i]);
}
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()-1; i++) {
printf("%05d %d %05d\n",ans[i].adr,ans[i].data,ans[i+1].adr);
}
printf("%05d %d -1\n",ans[ans.size()-1].adr,ans[ans.size()-1].data);
return 0;
}
PAT A1133 Splitting A Linked List (25) [链表]的更多相关文章
- 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 ...
- PAT Advanced 1074 Reversing Linked List (25) [链表]
题目 Given a constant K and a singly linked list L, you are supposed to reverse the links of every K e ...
- PAT 1133 Splitting A Linked List[链表][简单]
1133 Splitting A Linked List(25 分) Given a singly linked list, you are supposed to rearrange its ele ...
- PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)
1074 Reversing Linked List (25 分) Given a constant K and a singly linked list L, you are supposed ...
- 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 ...
- PAT Advanced 1097 Deduplication on a Linked List (25) [链表]
题目 Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplica ...
- PAT甲级题解-1097. Deduplication on a Linked List (25)-链表的删除操作
给定一个链表,你需要删除那些绝对值相同的节点,对于每个绝对值K,仅保留第一个出现的节点.删除的节点会保留在另一条链表上.简单来说就是去重,去掉绝对值相同的那些.先输出删除后的链表,再输出删除了的链表. ...
- A1133. Splitting A Linked List
Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...
- PAT甲题题解-1032. Sharing (25)-链表水题
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
随机推荐
- 072-PHP数组的交集和差集
<?php $arr1=array(1,3,4,5,34,78,99); //参加第一项竞赛的学生学号数组 $arr2=array(5,6,7,3,56,34,8,9); //参加第二项竞赛的学 ...
- C++使用 scanf函数
最近看了下C++,有些地方和c语言 还是不太一样的,当我在做输入一个数字的时候发现了错误.. 所以在使用scanf()的时候需要加下面这段在头文件 顶部: #define _CRT_SECURE_N ...
- 干货分享:深度解析Supplement Essay写作
今天Hotessay小编给同学们介绍下附加文书的创作思路.因为附加文书基本上都是短essay,所以简洁才是硬道理! 通常,我们可以把美国大学的附加文书分为以下几类: 1.Tell us about y ...
- Marvolo Gaunt's Ring(巧妙利用前后缀进行模拟)
Description Professor Dumbledore is helping Harry destroy the Horcruxes. He went to Gaunt Shack as h ...
- PHP购物网站
我使用的phpsteam经常用着用着就闪退,所以做起来挺麻烦的.里面的代码有抄袭借鉴网上的代码,就是那个php做购物网站点击量最高的那个. 但是我很多代码也是自己写的不和其相同. PHP是一门选修课, ...
- POJ 1584:A Round Peg in a Ground Hole
A Round Peg in a Ground Hole Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5741 Acc ...
- SqlServer 集合运算符
1.集合运算符概述 (1)集合运算符运用与集合之间的运算. (2)多元集合: 指的是来自两个输入查询的集合,可能包含重复项 (3)T-SQL 支持三种集合运算符 union .intersect .e ...
- 微信小程序手绘地图实现之《Canvas》
环境:微信SDK2.9+ + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...
- php语言注意点
PHP大小写问题 http://www.jb51.net/article/38579.htm 推荐大家始终坚持“大小写敏感”,遵循统一的代码规范.1. 变量名区分大小写 2. 函数名.方法名.类名不区 ...
- leetcode - 两数之和Ⅳ 输入BST(653)
题目描述:给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 解题思路:根据二叉搜索树的特点,对二叉搜索树进行中序遍历可以得到一个从小到达排 ...