zoukankan      html  css  js  c++  java
  • PAT A1052 Linked List Sorting [静态链表]

    题目描述

    链接
    给出一个链表,将链表排序,然后把链表上的结点按照data值的从小到大顺序输出

    分析

    • 定义静态链表的结构体,地址作为下标,注意,这里还需要记录address,为什么?因为排序以后下标不是地址了
    • 同时定义flag变量,因为给出的结点有些根本不在链表中,所以需要再遍历一次(另一种遍历的写法看下面的代码),标记有效结点,同时统计结点个数保存在cnt中,方便下面遍历和特判0 -1的情况
    • 排序的实现:链表的地址是分散的,所以要对node+maxn排序,按照data值,排序后下标不再是地址,所以要用add成员变量记录原来的地址,同时存在无效结点,所以用flag标识,cmp函数可以把flag=1的放在一起,flag=0的放在后面,从而使有效结点连续存放
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e6+10;
    struct Node{
        int add,data,next;
        bool flag;
    }node[maxn];
    
    
    bool cmp(Node a, Node b){
        if(a.flag != b.flag) return a.flag > b.flag;
        return a.data < b.data;
    }
    
    int main(){
        int n, st,cnt = 0;
        cin>>n>>st;
        int add,data,next;
        for(int i=0;i<n;i++){
            cin>>add>>data>>next;
            node[add] = {add, data, next, false}; //新的结构体赋值方法!!学到了
        }
        for(int i=st; i!=-1; i=node[i].next){ //遍历,新的方式!!学到了
            node[i].flag = true;
            cnt++;
        }
        if(cnt==0) printf("0 -1
    "); //全是无效结点
        else{
            sort(node, node+maxn, cmp);
            printf("%d %05d
    ",cnt,node[0].add);
            for(int i=0;i<cnt-1;i++){
                printf("%05d %d %05d
    ",node[i].add, node[i].data, node[i+1].add);
            }
            printf("%05d %d -1
    ",node[cnt-1].add, node[cnt-1].data);
        }
    }
    
    
  • 相关阅读:
    牛客练习赛71 F-红蓝图 (kruskal重构树 + 线段树合并)
    2020杭电多校第一场 Finding a MEX
    Codeforces 235C Cyclical Quest (后缀自动机)
    HDu6583 Typewriter (后缀自动机 + dp)
    2020牛客暑期多校训练营(第八场)A All-Star Game
    HDu4416 Good Article Good sentence (后缀自动机)
    icpc小米 A . Intelligent Warehouse
    计数类dp
    主席树
    博弈论
  • 原文地址:https://www.cnblogs.com/doragd/p/11263694.html
Copyright © 2011-2022 走看看