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
%05d %d", ans[i].address, ans[i].address, ans[i].date);
34     }
35     printf(" -1
");
36     return 0;
37 }
永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/12736432.html