给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0, K]区间内的元素都排在大于K的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K为10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出:第1个结点的地址;结点总个数,即正整数N (<= 105);以及正整数K (<=1000)。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址;Data是该结点保存的数据,为[-105, 105]区间内的整数;Next是下一结点的地址。题目保证给出的链表不为空。

输出格式:

对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

输入样例:

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

输出样例:

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
 package com.hone.basical;

 import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
/**
* 原题目:https://www.patest.cn/contests/pat-b-practise/1075
* @author Xia
* 思路:思考的是有点复杂,首先将所有的元素都装入一个链表中
* 然后按照地址来调整顺序
* 最后分别按照三个部分调整元素(小于零,[0,k],大于K)
*/ public class basicalLevel1075LinkedElementClassify { public static void main(String[] args) {
Scanner in = new Scanner(System.in); List<NodeNum> listN = new LinkedList<>();
int firstAdd = in.nextInt();
int nodeNum = in.nextInt();
int k = in.nextInt();
//将所有的数据添加到链表中
for (int i = 0; i < nodeNum; i++) {
NodeNum nn = new NodeNum();
nn.Address = in.nextInt();
nn.Date = in.nextInt();
nn.Next = in.nextInt();
listN.add(nn);
} List<NodeNum> reverList = new LinkedList<>();
int index = 0;
//调整链表顺序
int h = 0;
while (!listN.isEmpty()){
if (listN.get(h).Address == firstAdd) {
reverList.add(listN.get(h));
listN.remove(h);
break;
}
h++;
}
while (!listN.isEmpty()) {
if (reverList.get(index).Next == listN.get(h).Address) {
reverList.add(listN.get(h));
listN.remove(h);
index++;
h = 0;
}else {
h++;
}
} List<NodeNum> LessZero = new LinkedList<>();
List<NodeNum> betweenK = new LinkedList<>();
List<NodeNum> biggerK = new LinkedList<>();
for (int i = 0; i < reverList.size(); i++) {
int testData = reverList.get(i).Date;
if (testData < 0) {
LessZero.add(reverList.get(i));
}else if (testData<=k&&testData>=0) {
betweenK.add(reverList.get(i));
}else if (testData>k) {
biggerK.add(reverList.get(i));
}
} LessZero.addAll(betweenK);
LessZero.addAll(biggerK);
for (int i = 0; i < LessZero.size(); i++) {
if (i == LessZero.size()-1) {
System.out.printf("%05d %d %d%n", LessZero.get(i).Address,LessZero.get(i).Date,
-1);
}else {
System.out.printf("%05d %d %05d%n", LessZero.get(i).Address,LessZero.get(i).Date,
LessZero.get(i+1).Address);
}
}
}
} /**
* 定义一个结点类
* @author Xia
*/
class NodeNum{
int Address;
int Date;
int Next;
}

PAT——1075. 链表元素分类(25)的更多相关文章

  1. PAT Basic 1075 链表元素分类(25) [链表]

    题目 给定⼀个单链表,请编写程序将链表元素进⾏分类排列,使得所有负值元素都排在⾮负值元素的前⾯,⽽[0, K]区间内的元素都排在⼤于K的元素前⾯.但每⼀类内部元素的顺序是不能改变的.例如:给定链表为 ...

  2. PAT Basic 1075 链表元素分类 (25 分)

    给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元素的顺序是不能改变的.例如:给定链表为 ...

  3. PAT 1075 链表元素分类

    https://pintia.cn/problem-sets/994805260223102976/problems/994805262953594880 给定一个单链表,请编写程序将链表元素进行分类 ...

  4. PAT(B) 1075 链表元素分类(Java)

    题目链接:1075 链表元素分类 (25 point(s)) 题目描述 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大 ...

  5. P1075 链表元素分类

    P1075 链表元素分类 转跳点:

  6. 【PAT】B1075 链表元素分类(25 分)

    这道题算有点难,心目中理想的难度. 不能前怕狼后怕虎,一会担心超时,一会又担心内存过大,直接撸 将三部分分别保存到vector 有意思的在于输出 分别输出第一个的add和num 中间输出nextadd ...

  7. PAT甲级 链表题_C++题解

    链表处理 PAT (Advanced Level) Practice 链表题 目录 <算法笔记> 重点摘要:静态链表 1032 Sharing (25) 1052 Linked List ...

  8. [LeetCode] Remove Linked List Elements 移除链表元素

    Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...

  9. Web前端开发基础 第四课(CSS元素分类)

    元素分类 在讲解CSS布局之前,我们需要提前知道一些知识,在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <di ...

随机推荐

  1. Spring与Web

    一.定义页面及Servlet 在jsp页面加入以下,避免乱码 <meta charset="utf-8"> <body> <form action=& ...

  2. CentOS-Linux系统下安装JDK

    一般情况下,Linux系统都有自带的JDK,但不符合开发要求,所以需要卸载,重新安装JDK 步骤1:查看现有安装的JDK版本 命令: rpm -qa | grep -i java 步骤2:卸载已有软件 ...

  3. 【Chromium】GPU进程启动流程

    本篇文档以gpu进程的创建和启动为例,讲述chormium如何启动一个browser进程的子进程 PS:本文使用的chromium代码版本为71 前言 GPU进程的启动时机是由browser进程负责的 ...

  4. Thymeleaf学习记录(2)--自动编译设置

    了方便每次修改HTML文件都能实时刷新,做一下更改. 在application.properties文件加入以下命令: #thymeleaf start spring.thymeleaf.mode=H ...

  5. 【SPOJ】MGLAR10 - Growing Strings

    Gene and Gina have a particular kind of farm. Instead of growing animals and vegetables, as it is us ...

  6. 苹果ios,下拉菜单错位的问题(目前iphone x没发现有这个问题)

    苹果手机,点击下拉框,再点击确认按钮,页面位置错乱(感觉背景整体往上移动了一段距离,并且,页面所有的元素都往上移了一定的距离),导致手机页面底部留白的问题,并且,元素实际位置跟页面位置不一致. 解决方 ...

  7. C# 求百分比并保留2位小数

    , b = ; decimal c = (decimal)a / b; , ); , )).ToString() + "%"; Console.WriteLine( - resul ...

  8. c# 序列化接口(转载贴)

    http://www.cnblogs.com/TianFang/p/3724449.html

  9. osgEarth编译——以VS2012为例

    整理记录下 osgEarth编译过程. osgEarth是依赖于OSG的三维地理平台. 准备工作 OpenSceneGraph-3.4.0.zip OSG_3RDPARTY_DIR    http:/ ...

  10. 解决linux下fflush(stdin)无效

    void clean_stdin(void) { int c; do { c = getchar(); } while (c != '\n' && c != EOF); }