PAT成长之路——乙级链表类问题笔记
例题:
1075 链表元素分类 (25 分)
给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [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 个结点的地址;结点总个数,即正整数N (≤105);以及正整数K (≤103)。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。
接下来有 N 行,每行格式为:
[code]Address Data Next
其中
Address是结点地址;
Data是该结点保存的数据,为 [−105,105] 区间内的整数;
Next是下一结点的地址。题目保证给出的链表不为空。
输出格式:
对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例:
[code]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
输出样例:
[code]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
分析:
链表类问题的处理主要是如何存储各个节点的数据,简单的方法有很多,这里借鉴柳神的方法,用下标作为节点地址。
代码:
[code]#include <iostream> #include <vector> using namespace std; struct node { int data, next; }list[100000]; vector<int> v[3]; int main() { int start, n, k, a; scanf("%d%d%d", &start, &n, &k); for (int i = 0; i < n; i++) { scanf("%d", &a);//数组下标代表节点地址 scanf("%d%d", &list[a].data, &list[a].next);//用结构体储存节点的信息 } int p = start; while(p != -1) {//巨坑点:输入可能有费数据 int data = list[p].data; if (data < 0) v[0].push_back(p); else if (data >= 0 && data <= k) v[1].push_back(p); else v[2].push_back(p); p = list[p].next; } int flag = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < v[i].size(); j++) { if (flag == 0) { printf("%05d %d ", v[i][j], list[v[i][j]].data); flag = 1; } else { printf("%05d\n%05d %d ", v[i][j], v[i][j], list[v[i][j]].data); } } } printf("-1"); return 0; }
- PAT乙级1008. 数组元素循环右移问题 (20)
- PAT训练(乙级)—— 1008. 数组元素循环右移问题 (20)
- PAT乙级 1070. 结绳(25)--数学问题
- PAT乙级1008. 数组元素循环右移问题 (20)
- PAT乙级.1008. 数组元素循环右移问题 (20)
- PAT乙级 1008. 数组元素循环右移问题
- PAT乙级1008(C语言)-数组元素循环右移问题 (20)
- PAT乙级 1008. 数组元素循环右移问题 (20)
- PAT乙级(Basic Level)练习题 最难的问题
- PAT乙级 1040. 有几个PAT(25)--数学问题
- (PAT乙级)数组元素循环右移问题(Python)
- PAT成长之路——乙级1095 解码PAT准考证 (25 分)
- PAT乙级真题及训练集 PAT (Basic Level) Practise (中文)1008. 数组元素循环右移问题
- PAT(乙级)1015 反转链表 (25)(有点问题)
- PAT乙级1008. 数组元素循环右移问题 (20)
- PAT-乙级 1008 数组元素循环右移问题
- 1008. 数组元素循环右移问题 (20)-PAT乙级真题
- PAT乙级 1049. 数列的片段和(20)--数学问题
- PAT 乙级1008. 数组元素循环右移问题 (JAVA版)
- PAT 乙级 -- 1008 -- 数组元素循环右移问题