PAT1133:Splitting A Linked List

1133. Splitting A Linked List (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 (<= 105) 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 [-105, 105], 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

思路

逻辑水题,将一个链表划分成三个区间。

代码
#include<iostream>
#include<vector>
using namespace std;
class node
{
public:
    int val;
    int next;
};
vector<node> nodes(100000);
int main()
{
    vector<vector<int>> res(3);
    int start,N,K;
    while(cin >> start >> N >> K)
    {
        for(int i = 0;i < N;i++)
        {
            int tmp;
            cin >> tmp;
            cin >> nodes[tmp].val >> nodes[tmp].next;
        }
        while(start != -1)
        {
            if(nodes[start].val < 0)
                res[0].push_back(start);
            else if(nodes[start].val >= 0 && nodes[start].val <= K)
                res[1].push_back(start);
            else
                res[2].push_back(start);
            start = nodes[start].next;
        }
        int cnt = 0;
        for(int i = 0;i < res.size();i++)
        {
            for(int j = 0;j < res[i].size();j++)
            {
                if(cnt++ == 0)
                {
                    printf("%05d %d ",res[i][j],nodes[res[i][j]].val);
                }
                else
                {
                    printf("%05d
%05d %d ",res[i][j],res[i][j],nodes[res[i][j]].val);
                }
            }
        }
        printf("-1");
    }
}

  

原文地址:https://www.cnblogs.com/0kk470/p/7929650.html