首页 > 其他 > 详细

PAT Basic 1075 链表元素分类(25) [链表]

时间:2020-02-12 19:14:46      阅读:71      评论:0      收藏:0      [点我收藏+]

题目

给定?个单链表,请编写程序将链表元素进?分类排列,使得所有负值元素都排在?负值元素的前?,?[0, K]区间内的元素都排在?于K的元素前?。但每?类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K为10,则输出应该为-4→-6→-2→7→0→5→10→18→11。
输?格式:
每个输?包含1个测试?例。每个测试?例第1?给出:第1个结点的地址;结点总个数,即正整数N(<= 105);以及正整数K (<=1000)。结点的地址是5位?负整数,NULL地址?-1表示。接下来有N?,每?格式为:
Address Data Next
其中Address是结点地址;Data是该结点保存的数据,为[-105, 105]区间内的整数;Next是下?结点的地址。题?保证给出的链表不为空。
输出格式:
对每个测试?例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占??,格式与输?相同。
输?样例:
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
输出样例:
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个结点,将值为负数的结点放置在非负节点之前,将小于等于k的结点放置在大于k的结点之前

解题思路

思路 01

  1. 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
  2. 依次遍历链表中结点
    2.1 如果结点值<0,结点序号设置为cnt1++
    2.2 如果结点值>=0&&<=k,结点序号设置为maxn+cnt2++
    2.3 如果结点值>k,结点序号设置为2*maxn+cnt3++
  3. 按照order排序,并依次打印

思路 02

  1. 用数组存放结点,用属性order记录结点在链表中的序号(初始化为3*maxn)
  2. 依次遍历链表中结点
    2.1 依次遍历链表中结点,找到所有值<0的节点,存放于vector
    2.2 依次遍历链表中结点,找到所有值>=0&&<=k的节点,存放于vector
    2.3 依次遍历链表中结点,找到所有值>k的节点,存放于vector
  3. 依次打印vector中结点

易错点

已知结点中存在无效结点(即不在链表中的结点)

Code

Code 01(最优)

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct node {
    int adr;
    int data;
    int next;
    int order=3*maxn;
} nds[maxn];
bool cmp(node &n1,node &n2) {
    return n1.order<n2.order;
}
int main(int argc,char * argv[]) {
    int hadr,n,k,adr;
    scanf("%d %d %d",&hadr,&n,&k);
    for(int i=0; i<n; i++) {
        scanf("%d",&adr);
        scanf("%d %d",&nds[adr].data,&nds[adr].next);
        nds[adr].adr=adr;
    }
    int cnt1=0,cnt2=0,cnt3=0;
    for(int i=hadr; i!=-1; i=nds[i].next) {
        if(nds[i].data<0)nds[i].order=cnt1++;
        if(nds[i].data>=0&&nds[i].data<=k)nds[i].order=maxn+cnt2++;
        if(nds[i].data>k)nds[i].order=2*maxn+cnt3++;
    }
    sort(nds,nds+maxn,cmp);
    int cnt=cnt1+cnt2+cnt3; 
    for(int i=0; i<cnt-1; i++) {
        printf("%05d %d %05d\n",nds[i].adr,nds[i].data,nds[i+1].adr);
    }
    printf("%05d %d -1\n",nds[cnt-1].adr,nds[cnt-1].data);
    return 0;
}

Code 02

#include <iostream>
#include <vector>
using namespace std;
const int maxn=100010;
struct node {
    int adr;
    int data;
    int next;
} nds[maxn];
int main(int argc,char * argv[]) {
    int hadr,n,k,adr;
    scanf("%d %d %d",&hadr,&n,&k);
    for(int i=0; i<n; i++) {
        scanf("%d",&adr);
        scanf("%d %d",&nds[adr].data,&nds[adr].next);
        nds[adr].adr=adr;
    }
    vector<node> v,ans;
    for(int i=hadr; i!=-1; i=nds[i].next) {
        v.push_back(nds[i]);
    }
    for(int i=0; i<v.size(); i++) {
        if(v[i].data<0)ans.push_back(v[i]);
    }
    for(int i=0; i<v.size(); i++) {
        if(v[i].data>=0&&v[i].data<=k)ans.push_back(v[i]);
    }
    for(int i=0; i<v.size(); i++) {
        if(v[i].data>k)ans.push_back(v[i]);
    }
    for(int i=0; i<ans.size()-1; i++) {
        printf("%05d %d %05d\n",ans[i].adr,ans[i].data,ans[i+1].adr);
    }
    printf("%05d %d -1\n",ans[ans.size()-1].adr,ans[ans.size()-1].data);
    return 0;
}


PAT Basic 1075 链表元素分类(25) [链表]

原文:https://www.cnblogs.com/houzm/p/12300113.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!