1133 Splitting A Linked List
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 (≤) which is the total number of nodes, and a positive K (≤). 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 [, 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
题意:
给出一个自定义的链表,将链表按照要求的顺序输出。
思路:
构造一个结构体来表示节点,开一个数组用下标来表示结点的地址,根据结点地址遍历数组,将符合要求的结点依次放入ans中,最后将ans中的数据输出即可。
Code:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 struct Node { 6 int address; 7 int date; 8 int next; 9 }; 10 11 int main() { 12 int first, n, k; 13 cin >> first >> n >> k; 14 vector<Node> v(100005), ans; 15 int address, date, next; 16 for (int i = 0; i < n; ++i) { 17 cin >> address >> date >> next; 18 v[address] = {address, date, next}; 19 } 20 address = first; 21 for (; address != -1; address = v[address].next) 22 if (v[address].date < 0) ans.push_back(v[address]); 23 24 address = first; 25 for (; address != -1; address = v[address].next) 26 if (v[address].date >= 0 && v[address].date <= k) 27 ans.push_back(v[address]); 28 address = first; 29 for (; address != -1; address = v[address].next) 30 if (v[address].date > k) ans.push_back(v[address]); 31 printf("%05d %d", ans[0].address, ans[0].date); 32 for (int i = 1; i < ans.size(); ++i) { 33 printf(" %05d\n%05d %d", ans[i].address, ans[i].address, ans[i].date); 34 } 35 printf(" -1\n"); 36 return 0; 37 }