题目

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

  1. 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
  2. 依次遍历链表中结点

    2.1 如果结点值<0,结点序号设置为cnt1++

    2.2 如果结点值>=0&&<=k,结点序号设置为maxn+cnt2++

    2.3 如果结点值>k,结点序号设置为2*maxn+cnt3++
  3. 按照order排序,并依次打印

思路 02

  1. 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
  2. 依次遍历链表中结点

    2.1 依次遍历链表中结点,找到所有值<0的节点,存放于vector

    2.2 依次遍历链表中结点,找到所有值>=0&&<=k的节点,存放于vector

    2.3 依次遍历链表中结点,找到所有值>k的节点,存放于vector
  3. 依次打印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) [链表]的更多相关文章

  1. 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 ...

  2. 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 ...

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

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

  4. 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 ...

  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 valu ...

  6. 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 ...

  7. PAT甲级题解-1097. Deduplication on a Linked List (25)-链表的删除操作

    给定一个链表,你需要删除那些绝对值相同的节点,对于每个绝对值K,仅保留第一个出现的节点.删除的节点会保留在另一条链表上.简单来说就是去重,去掉绝对值相同的那些.先输出删除后的链表,再输出删除了的链表. ...

  8. A1133. Splitting A Linked List

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

  9. PAT甲题题解-1032. Sharing (25)-链表水题

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

随机推荐

  1. 四十五、SAP中Message的管理

    一.事务代码SE91 二.输入相关名字,点击创建 三.输入内容 四.定义成本地对象 五.在消息中添加一条短文本 六.我们代码如下 七.执行

  2. 十、SAP小数需要用引号括起来

    一.我们定义一个浮点型f的变量,然后赋值,检查会报错 二.我们把引号括起来之后,就正常了,如下: 三.输出效果如下: 注意:f类型的变量,输出不是准确值

  3. mencoder及ffmpeg的基本命令

    前段时间想在ubuntu下对视频进行格式转换,多方查找之后,接触了mencoder与ffmpeg. mencoder mencoder 是一款命令行方式的视频处理软件,是Mplayer自带的编码工具, ...

  4. 每天一点点之laravel框架开发 - API通过access_token获取用户id报 Unauthenticated. 错误(passport)

    1.首先保证你的config/auth.php 中 guards 的 api 的 driver 选项改为 passport 2.注册中间件,在 app/Http/Kernel.php 文件中的 $ro ...

  5. 4K电视到底值不值得购买?

    在智能手机等移动终端的冲击下,近年来电视厂商的日子越来越不好过.为了吸引消费者的关注,电视厂商也是绞尽脑汁不断在电视上增加各种噱头功能.比如当年被吹得神乎其神.在家就享受影院体验的3D电视,就因为3D ...

  6. 下页小希学MVC5+EF6.2 学习记录一

    目的:1 学习mvc+ef 2  写下日记也是对自己的督促 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 & ...

  7. 201903-1 小中大 Java

    思路: 中位数就是排序后中间的那个数.如果有偶数个数,就是中间两个数的平均值. 注意,这个平均值可能是整数,可能是小数,如果都是一样的处理,如果输出整数是3.0,而不是3,就有问题.所以需要分开处理. ...

  8. 201809-1 卖菜 Java

    思路: 需要两个数组,一个保存原始数据 import java.util.Scanner; public class Main { public static void main(String[] a ...

  9. Android自定义View——贝塞尔曲线实现水波纹效果

    我们使用到的是Path类的quadTo(x1, y1, x2, y2)方法,属于二阶贝塞尔曲线,使用一张图来展示二阶贝塞尔曲线,这里的(x1,y1)是控制点,(x2,y2)是终止点,起始点默认是Pat ...

  10. DES与MD5加密

    using System; using System.Data; using System.Configuration; using System.Web; using System.Security ...