A1133 Splitting A Linked List (25 分| 链表,附详细注释,逻辑分析)
作者:互联网
写在前面
- 思路分析
- 理解题意
- 给1个链表和K,遍历链表后将<0的结点先输出,再将0~k区间的结点输出,最后输出>k的结点
- 具体实现:
- 1.所有节点用结构体{id, data, next}存储
- 2.遍历链表,找出在此链表中的节点,放入容器器v中
- 3.把节点分三类{(-⽆无穷, 0) , [0,k], (k,+⽆无穷) } ,按段、按先后顺序依次放进容器ans中,最后输出即可
- 理解题意
- 题目有一定难度,学习ing
- 理解题意耗费时间(
核心问题
) - 实现思想,较为巧妙
- 理解题意耗费时间(
测试用例
-
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 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
ac代码
-
#include <iostream> #include <vector> using namespace std; struct node { int id, data, next; }; int main() { int bgin, n, k, s, d, e; scanf("%d%d%d", &bgin, &n, &k); node a[100010]; vector<node> v, ans; for (int i = 0; i < n; i++) { scanf("%d%d%d", &s, &d, &e); a[s] = {s, d, e}; } // 将初始链表序列存入数组 for (; bgin != -1; bgin = a[bgin].next) v.push_back(a[bgin]); // 处理小于0元素 for (int i = 0; i < v.size(); i++) if (v[i].data < 0) ans.push_back(v[i]); // 处理大于等于0,小于k元素 for (int i = 0; i < v.size(); i++) if (v[i].data >= 0 && v[i].data <= k) ans.push_back(v[i]); // 处理大于k元素 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].id, ans[i].data, ans[i + 1].id); printf("%05d %d -1\n", ans[ans.size() - 1].id, ans[ans.size() - 1].data); return 0; }
知识点小结
- 结构体赋值
a[s] = {s, d, e};
标签:25,A1133,int,链表,bgin,ans,data,size 来源: https://blog.csdn.net/qq_24452475/article/details/100591777