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 (<= 10^5^) 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 [-10^5^, 10^5^], 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
题目大意:给出一些节点信息,按照节点在链表中原来的位置,把链表分为三段,一段的值小于零, 一段的值在[0,k]之间, 另一段的值大于k;
思路:用两个数组保存节点的值(value)和指向下一节点的指针(link); 根据节点的值把节点添加到不同的链表中; 然后在把所有的节点按照顺序添加到一个链表中;
也可以不用把所有的节点添加到一个链表中,但是输出信息的时候,要判断的情况态度了,容易出现段错误
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct node{ 5 int addr, val, next; 6 }; 7 8 int main(){ 9 int root, n, k, i; 10 cin>>root>>n>>k; 11 vector<node> v1, v2, v3; 12 vector<int> link(100000, -1), value(100000); 13 for(i=0; i<n; i++){ 14 int addr, val, next; 15 scanf("%d%d%d", &addr, &val, &next); 16 link[addr]=next; 17 value[addr]=val; 18 } 19 while(true){ 20 if(root==-1) break; 21 node nnode; nnode.addr=root; nnode.val=value[root]; 22 if(value[root]<0) v1.push_back(nnode); 23 else if(value[root]<=k) v2.push_back(nnode); 24 else v3.push_back(nnode); 25 root=link[root]; 26 } 27 for(i=0; i<v2.size(); i++) v1.push_back(v2[i]); 28 for(i=0; i<v3.size(); i++) v1.push_back(v3[i]); 29 for(i=0; i<v1.size()-1; i++)printf("%05d %d %05d\n", v1[i].addr, v1[i].val, v1[i+1].addr); 30 printf("%05d %d %d\n", v1[v1.size()-1].addr, v1[v1.size()-1].val, -1); 31 return 0; 32 }
原文地址:https://www.cnblogs.com/mr-stn/p/9179407.html