【PAT甲级题解】1052 Linked List Sorting (25分)

本题常规链表题,与乙级有区别的地方是,这次要求对值排序,而不是翻转或者区块翻转,对于值排序,我选择使用第一个结构体按照散列存入list数组中,为了处理脏数据还能实现排序,选择使用第二个结构体node1存入vector中,然后对vector中的数据排序,排序后循环输出,坑点一:存在全部都是脏数据的情况,需要输出0和-1,但是第一次做测试点3错误扣3分,最终拿到22分,一直没找到答案,先放在这里,今后二刷回来考虑一下

代码:

#include
#include
#include
#include
using namespace std;
const int maxn = 1e5+10;
struct node{
     
    int data;
    int next;
}list[maxn];
struct node1{
     
    int add;
    int data;
};
bool cmp(node1 a,node1 b){
     
    return a.data < b.data;
}
int main() {
     
    int n, first;
    cin >> n >> first;
    while (n--) {
     
        int temp;
        cin >> temp;
        cin >> list[temp].data >> list[temp].next;
    }
    vector<node1> vt;
    while (first != -1) {
     
        vt.push_back({
     first, list[first].data});
        first = list[first].next;
    }
    sort(vt.begin(), vt.end(), cmp);
    int key = 0;
    if(vt.size() == 0){
     
        cout<<0<<' '<<-1<<endl;
        return 0;
    }
    cout << vt.size() << ' ' << vt[0].add << endl;
    for (int i = 0; i < vt.size(); ++i) {
     
        if (!key) {
     
            key = 1;
            printf("%05d %d ", vt[i].add, vt[i].data);
        } else {
     
            printf("%05d\n%05d %d ", vt[i].add, vt[i].add, vt[i].data);
        }
    }
    cout << -1;
    return 0;
}

你可能感兴趣的:(PAT甲级题解,算法,c++)