PAT 1025反转链表
2017-02-25 01:17
288 查看
题目:1025. 反转链表 (25)
给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。输入样例:
00100 6 400000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 3321833218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
很坑的一道题,用数组保存信息。
结点地址就是数组下表,然后在多申请几个数组用来储存Data和NextAddress。
题目有一个点的有无用数据,所以我们还要用cnt记录有效结点数目。
代码如下:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int begin, N, K; scanf("%d%d%d", &begin, &N, &K); vector<int> data(100000,0), next(100000,0), list(100000,0), result(100000,0); for (int i = 0; i < N; i++) { int temp; scanf("%d",&temp); scanf("%d%d", &data[temp], &next[temp]); } int cnt = 0; int tempAddress = begin; while (1) { list[cnt++] = tempAddress; tempAddress = next[tempAddress]; if (tempAddress == -1) break; } copy(list.begin(), list.end(), result.begin()); int reverseNum = cnt / K; vector<int>::iterator tempIter = result.begin(); for (int i = 0; i < reverseNum; i++) { reverse(tempIter, tempIter + K); tempIter = tempIter + K; } for (int i = 0; i < cnt - 1; i++) { next[result[i]] = result[i + 1]; } next[result[cnt - 1]] = -1; for (int i = 0; i < cnt-1; i++) { printf("%05d %d %05d\n",result[i],data[result[i]],next[result[i]]); } printf("%05d %d -1\n", result[cnt-1], data[result[cnt-1]]); return 0; }
本来是用数组储存结点信息做的,把2个地址作为结点的属性,但是查找操作太费时间了,有一个点实在过不去啊。代码也附上去把,用了不少STL的东西。
当时为了稍微快一点,还把所有的cin、cout都换掉了,不过好像也没有什么用处就是了。
有一个点始终过不去。
#include <vector> #include <cstdio> #include <algorithm> #include <string> #include <iterator> using namespace std; struct Node { string address, nextAddress; int data; }; int main() { string beginAddress; int N, K; cin >> beginAddress >> N >> K; vector<Node> vecNode; Node nodeTemp; string s1(5,' '), s2(5,' '); for (int i = 0; i < N; i++) { int data; //cin >> s1 >> data >> s2; scanf("%s%d%s", &s1[0], &data, &s2[0]); nodeTemp.address = s1; nodeTemp.data = data; nodeTemp.nextAddress = s2; vecNode.push_back(nodeTemp); } vector<Node> vecList; string tempAddress = beginAddress; while(1) { vector<Node>::iterator it=find_if(vecNode.begin(), vecNode.end(), [&](const Node& node) {return node.address == tempAddress; }); if (it != vecNode.end()) vecList.push_back(*it); else break; tempAddress = it->nextAddress; } int len = vecList.size(); int reverseNum = len / K; vector<Node>::iterator it = vecList.begin(); for (int t = 0; t < reverseNum;t++) { reverse(it, it+ K); it = it + K; } for (int i = 0; i < vecList.size()-1; i++) { vecList[i].nextAddress = vecList[i + 1].address; } vecList[vecList.size()-1].nextAddress = "-1"; for (int i = 0; i < vecList.size(); i++) //cout << vecList[i].address << " " << vecList[i].data << " " << vecList[i].nextAddress << endl; printf("%s %d %s\n", vecList[i].address.c_str(), vecList[i].data, vecList[i].nextAddress.c_str()); return 0; }
相关文章推荐
- 1025. 反转链表 (25) PAT乙级真题
- PAT 1025. 反转链表 (25)
- pat1025反转链表
- PAT 1025. 反转链表 (25)
- PAT-B 1025. 反转链表
- 1025. 反转链表 (25)--PAT乙级
- PAT 1025 反转链表
- PAT (Basic Level) Practise (中文)1025. 反转链表 (25)
- PAT 乙级 1025. 反转链表
- PAT (Basic Level) Practise (中文)1025. 反转链表 (25)
- PAT乙级1025. 反转链表 (25)
- PAT乙级—1025. 反转链表 (25)-native
- PAT basic-level 1025 反转链表 笔记
- PAT_乙级 1025 反转链表
- pat甲级1074. Reversing Linked List (25)、乙级1025. 反转链表 (25)
- PAT乙级 1025. 反转链表 (25)
- ZJU PAT 1025 反转链表
- PAT乙级 1025.反转链表
- PAT (Basic Level) Practise (中文) 1025. 反转链表 (25)
- PAT 乙级 1025. 反转链表 (25)