PAT (Advanced) 1074. Reversing Linked List (25)
来源:互联网 发布:最优化pdf百度云 编辑:程序博客网 时间:2024/09/21 09:25
根据评论里的那种思路写的一个代码。这种思路很简单,用一个数组保存每个节点的地址,然后对数组进行reverse。这个题目还可以运用map,也非常方便。
#include<iostream>#include<cstring>#include <algorithm>using namespace std;int node[100002][2];int main(){int list[100002];int i;int st, k;int n;cin >> st >> n >> k;for (i = 0; i<n; i++){int add, data, next;cin >> add >> data >> next;node[add][0] = data;node[add][1] = next;}int cnt = 0;int cur = st;while (cur != -1){list[cnt++] = cur;cur = node[cur][1];}i = 0;while (i + k <= cnt){reverse(list + i, list + i + k);i += k;}for (i = 0; i < cnt - 1; i++){printf("%05d %d %05d\n", list[i], node[list[i]][0], list[i+1]);}printf("%05d %d -1\n", list[i], node[list[i]][0]);return 0;}
之前写了一个代码,在最底下,有bug,最后一个1分的case无法通过,原因是没有考虑到输入的N个节点,有某个或某些不在链表上,所以最后要输出的总的节点数小于N。
这个题目我用的方法非常蛋疼,写了很久。这个题目还有很多取巧的办法。我完整通过的代码如下:
#include <iostream>#include <vector>using namespace std;struct Node{int data, next;}node[100005];void printList(int start){int cur = start;while (node[cur].next != -1){printf("%05d %d %05d\n", cur, node[cur].data, node[cur].next);cur = node[cur].next;}if (node[cur].next == -1){printf("%05d %d -1\n", cur, node[cur].data);}}int reverseK(int start, int n, int k){int head, pre, cur, next, pos, len1, len2, times = n / k;vector<int> first, last;first.push_back(start);for (int i = 0; i < times; i++){pre = -1;cur = start;for (pos = 1; pos <= k; pos++){next = node[cur].next;if (pos == k){if (i == 0)head = cur;last.push_back(cur);first.push_back(next);}node[cur].next = pre;pre = cur;cur = next;}start = next;}len1 = first.size(), len2 = last.size();for (int i = 0; i < len2 - 1; i++)node[first[i]].next = last[i + 1];if (len1 > len2)node[first[len1 - 2]].next = first[len1 - 1];return head;}int main(){int head, N, K;cin >> head >> N >> K;int len = 1;int Address, Data, Next;for (int i = 0; i < N; i++){cin >> Address >> Data >> Next;node[Address].data = Data;node[Address].next = Next;}int cur = head;while (node[cur].next != -1){len++;cur = node[cur].next;}if (K != 1)head = reverseK(head, len, K);printList(head);return 0;}
before:
方法非常蛋疼,最后一个1分的case始终过不了,蛋疼。代码如下,等待改进。。。
ps:如果你发现了我代码中的bug,为什么过不了,以及如果你有更好的方法,请一定要留言告诉我,非常感谢!
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <vector>using namespace std;struct Node{int data, next;}node[100005];void printList(int start, int n){int cur = start;for (int i = 0; i < n; i++){printf((node[cur].next == -1 ? "%05d %d %d\n" : "%05d %d %05d\n"), cur, node[cur].data, node[cur].next);cur = node[cur].next;}}int reverseK(int start, int n, int k){int head, pre, cur, next, pos, len1, len2, times = n / k;vector<int> first, last;first.push_back(start);for (int i = 0; i < times; i++){pre = -1;cur = start;for (pos = 1; pos <= k; pos++){next = node[cur].next;if (pos == k){if (i == 0)head = cur;last.push_back(cur);first.push_back(next);}node[cur].next = pre;pre = cur;cur = next;}start = next;}len1 = first.size(), len2 = last.size();for (int i = 0; i < len2 - 1; i++)node[first[i]].next = last[i + 1];if (len1 > len2)node[first[len1 - 2]].next = first[len1 - 1];return head;}int main(){//freopen("in.txt", "r", stdin);int head, N, K;cin >> head >> N >> K;int Address, Data, Next;for (int i = 0; i < N; i++){cin >> Address >> Data >> Next;node[Address].data = Data;node[Address].next = Next;}if (K != 1)head = reverseK(head, N, K);printList(head, N);return 0;}
0 0
- PAT (Advanced) 1074. Reversing Linked List (25)
- 【C++】PAT (advanced level)1074. Reversing Linked List (25)
- PAT Advanced Level 1074. Reversing Linked List (25)
- 【PAT】【Advanced Level】1074. Reversing Linked List (25)
- PAT (Advanced Level) Practise 1074 Reversing Linked List (25)
- PAT (Advanced Level) Practise 1074 Reversing Linked List (25)
- PAT A 1074. Reversing Linked List (25)
- pat 1074. Reversing Linked List (25)
- PAT 1074. Reversing Linked List (25)
- PAT 1074. Reversing Linked List (25)
- PAT 1074. Reversing Linked List (25)
- 【PAT】1074. Reversing Linked List (25)
- PAT甲级1074. Reversing Linked List (25)
- PAT-A-1074. Reversing Linked List (25)
- 【PAT甲级】1074. Reversing Linked List (25)
- Pat(A) 1074. Reversing Linked List (25)
- PAT 1074. Reversing Linked List (25)
- PAT 甲级 1074. Reversing Linked List (25)
- 网易游戏2011.10.15校园招聘会笔试题
- 公开课可下载资源汇总
- [tornado]使用自身的mysql封装,连接数据库
- MIT牛人林达华的 “图˙谱˙马尔可夫过程˙聚类结构 ”————经典、透彻
- 【prim】 poj 2031 Building a Space Station
- PAT (Advanced) 1074. Reversing Linked List (25)
- 使用Vector
- Interview----链表的倒数第K个元素
- 2013级Java第1周(春)项目——一个简单的考勤签到程序
- 博客开通了
- MongoDB backup/restore
- 九度oj 题目1033:继续xxx定律 ZOJ 【ZJU2009考研机试题3】
- 在Redhat5.5上安装oracle11gR2
- 删除git版本控制下的.idea目录