zoukankan      html  css  js  c++  java
  • 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次,按顺序放入地址,之后再按顺序输出即可!

  • 相关阅读:
    如何快速取得股票交易历史数据
    ArcSDE性能优化系列之ArcSDE参数篇
    2020年8月29日
    2020年8月31日
    9.2
    2020年8月25日
    2020年8月30日
    2020年8月27日
    2020年8月26日
    2020年8月28日
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9604025.html
Copyright © 2011-2022 走看看