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

给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[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 }

 

posted @ 2017-12-08 17:05  SnailsCoffee  阅读(350)  评论(0编辑  收藏  举报