PAT 1133 Splitting A Linked List[链表][简单]

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 (105​​) which is the total number of nodes, and a positive K (103​​). 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

 题目大意:给出一个链表,和一个数K,将<0的数都按发现的顺序放在开头,<=k的数放在负数后,并且也是按原来的顺序,>k的按顺序在最后。

//很简答的题目,一开始遍历的方式错了,不过改了过来,

AC代码:

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
struct Node{
    int data,next;
}vn[100000];

int main() {
    int from,n,k;
    cin>>from>>n>>k;
   // vector<Node> vn(n);
    int add,da,to;
    for(int i=0;i<n;i++){
        cin>>add>>da>>to;
        //vn[add].addr=add;
        vn[add].data=da;
        vn[add].next=to;
    }
    vector<int> re;
    //本次找出是负数的,并且编号存储。
//    for(int i=0;i<n;i++){
//        if(vn[i].data<0)
//            re.push_back(i);
//    }
//    for(int i=0;i<n;i++){
//        if(vn[i].data>=0&&vn[i].data<=k)
//            re.push_back(i);
//    }
//    for(int i=0;i<n;i++){
//        if(vn[i].data>k)
//            re.push_back(i);
//    }这样去遍历链表是不对的,并不能分出来次序啊。
    for(int i=from;i!=-1;i=vn[i].next){
        if(vn[i].data<0)
            re.push_back(i);
    }
    for(int i=from;i!=-1;i=vn[i].next){
        if(vn[i].data>=0&&vn[i].data<=k){
            re.push_back(i);
        }
    }
    for(int i=from;i!=-1;i=vn[i].next){
        if(vn[i].data>k)
            re.push_back(i);
    }
    for(int i=0;i<re.size();i++){
        if(i==re.size()-1){
            printf("%05d %d -1",re[i],vn[re[i]].data);
        }//cout<<re[i]<<" "<<vn[re[i]].data<<"-1";
        else{
            printf("%05d %d %05d
",re[i],vn[re[i]].data,re[i+1]);
        }//cout<<re[i]<<" "<<vn[re[i]].data<<" "<<re[i+1]<<'
';
    }

    return 0;
}

1.链表遍历的主要就是使用数组下标表示链表地址,根据这个对链表进行遍历,其他的问题就不大了。

2。从前往后遍历链表3次,按顺序放入地址,之后再按顺序输出即可!

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9604025.html