给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[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
1 package com.hone.basical; 2 3 import java.util.LinkedList; 4 import java.util.List; 5 import java.util.Scanner; 6 /** 7 * 原题目:https://www.patest.cn/contests/pat-b-practise/1075 8 * @author Xia 9 * 思路:思考的是有点复杂,首先将所有的元素都装入一个链表中 10 * 然后按照地址来调整顺序 11 * 最后分别按照三个部分调整元素(小于零,[0,k],大于K) 12 */ 13 14 public class basicalLevel1075LinkedElementClassify { 15 16 public static void main(String[] args) { 17 Scanner in = new Scanner(System.in); 18 19 List<NodeNum> listN = new LinkedList<>(); 20 int firstAdd = in.nextInt(); 21 int nodeNum = in.nextInt(); 22 int k = in.nextInt(); 23 //将所有的数据添加到链表中 24 for (int i = 0; i < nodeNum; i++) { 25 NodeNum nn = new NodeNum(); 26 nn.Address = in.nextInt(); 27 nn.Date = in.nextInt(); 28 nn.Next = in.nextInt(); 29 listN.add(nn); 30 } 31 32 List<NodeNum> reverList = new LinkedList<>(); 33 int index = 0; 34 //调整链表顺序 35 int h = 0; 36 while (!listN.isEmpty()){ 37 if (listN.get(h).Address == firstAdd) { 38 reverList.add(listN.get(h)); 39 listN.remove(h); 40 break; 41 } 42 h++; 43 } 44 while (!listN.isEmpty()) { 45 if (reverList.get(index).Next == listN.get(h).Address) { 46 reverList.add(listN.get(h)); 47 listN.remove(h); 48 index++; 49 h = 0; 50 }else { 51 h++; 52 } 53 } 54 55 List<NodeNum> LessZero = new LinkedList<>(); 56 List<NodeNum> betweenK = new LinkedList<>(); 57 List<NodeNum> biggerK = new LinkedList<>(); 58 for (int i = 0; i < reverList.size(); i++) { 59 int testData = reverList.get(i).Date; 60 if (testData < 0) { 61 LessZero.add(reverList.get(i)); 62 }else if (testData<=k&&testData>=0) { 63 betweenK.add(reverList.get(i)); 64 }else if (testData>k) { 65 biggerK.add(reverList.get(i)); 66 } 67 } 68 69 LessZero.addAll(betweenK); 70 LessZero.addAll(biggerK); 71 for (int i = 0; i < LessZero.size(); i++) { 72 if (i == LessZero.size()-1) { 73 System.out.printf("%05d %d %d%n", LessZero.get(i).Address,LessZero.get(i).Date, 74 -1); 75 }else { 76 System.out.printf("%05d %d %05d%n", LessZero.get(i).Address,LessZero.get(i).Date, 77 LessZero.get(i+1).Address); 78 } 79 } 80 } 81 } 82 83 /** 84 * 定义一个结点类 85 * @author Xia 86 */ 87 class NodeNum{ 88 int Address; 89 int Date; 90 int Next; 91 }