• 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次,按顺序放入地址,之后再按顺序输出即可!

  • 相关阅读:
    开发网站多端同时测试简单演示
    Vue DevTools 安装和浏览器跳转到编辑器指定组件
    在linux 平台上源码编译安装MySQL 8.0
    程序员PS技能(四):程序员创建PSD文件、展示简单PSD设计流程,上传PSD至蓝湖,并下载Demo切图
    Matlab+Qt开发笔记(二):Qt打开mat文件显示读取的数据
    产品分享:Qt数学函数公式学科工具,当前版本v1.0.0
    Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本
    libmatio开发笔记(一):matlab文件操作libmatio库介绍,编译和基础Demo
    Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
    Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9604025.html
Copyright © 2020-2023  润新知