pat 1133

1133 Splitting A Linked List (25分)
 

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 −.

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

题意:给定n个结点,对其按照关键字排序,要求关键字为负数排在前面,其次是[0,k]范围内的数,最后是大于k的数,要求排序不改变相同类型的结点的相对位置。
思路:首先用hash的方法读入关键字,开一个大小为100005的数组,数组下标表示地址,读入的时候往里面存入关键字。再开一个nextNode[100005]的数组存放地址为addr的结点的下一个结点的地址。从根节点开始遍历,遍历三遍,第一次把所有负的结点加入vector数组,第二次[0,k]范围的结点,最后一次大于k的结点。
注意:有些结点可能不在链表中,因此要算一下链表中结点的个数,最后输出的时候按照链表中结点的个数进行输出。

代码如下
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> head,tail,dat;
int node[100005];
int nextNode[100005];
int main(){
    fill(nextNode,nextNode+100005,-1);
    int root,n,k;
    scanf("%d%d%d",&root,&n,&k);
    int addr,data,nex;
    for(int i=0;i<n;i++){
        scanf("%d%d%d",&addr,&data,&nex);
        node[addr]=data;
        nextNode[addr]=nex;
    }
    int i=root;
    int cnt=0;
    while(i!=-1) {
        i=nextNode[i];
        cnt++;
    }
    i=root;
    while(i!=-1){
        if(node[i]<0){
            head.push_back(i);
            dat.push_back(node[i]);
        }
        i=nextNode[i];
    }
    i=root;
    while(i!=-1){
        if(node[i]>=0&&node[i]<=k){
            head.push_back(i);
            dat.push_back(node[i]);
        }
        i=nextNode[i];
    }
    i=root;
    while(i!=-1){
        if(node[i]>k){
            head.push_back(i);
            dat.push_back(node[i]);
        }
        i=nextNode[i];
    }
    for(int i=0;i<cnt;i++){
        if(i!=cnt-1){
            printf("%05d %d %05d
",head[i],dat[i],head[i+1]);
        }
        else
            printf("%05d %d -1
",head[i],dat[i]);
        
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/foodie-nils/p/13269000.html