PAT 1074 Reversing Linked List[链表][一般]
1074 Reversing Linked List (25)(25 分)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (<= 10^5^) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is an integer, and Next is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
题目大意:给出一个链表,按照数k对其进行反转,并输出反转后的链表。
代码来自:https://www.liuchuo.net/archives/1910
#include <iostream> #include<stdio.h> using namespace std; int main() { int first, k, n, sum = 0; cin >> first >> n >> k; int temp, data[100005], next[100005], list[100005], result[100005]; for (int i = 0; i < n; i++) { cin >> temp; cin >> data[temp] >> next[temp]; } while (first != -1) {//还需要再次统计,并不是所有的节点都是有效的。 list[sum++] = first; first = next[first]; } for (int i = 0; i < sum; i++) result[i] = list[i];//现在result里都已经是顺序排列了 for (int i = 0; i < (sum - sum % k); i++){ result[i] = list[i / k * k + k - 1 - i % k]; //printf("%d %d\n",i,i / k * k + k - 1 - i % k); } for (int i = 0; i < sum - 1; i++) printf("%05d %d %05d\n", result[i], data[result[i]], result[i + 1]); printf("%05d %d -1", result[sum - 1], data[result[sum - 1]]); return 0; }
//并没有真正的使用结构体来构造链表。data也是使用地址下标来存储,十分简洁。
1.由于输入的节点可能存在异常的,所以又重新统计了一下。
2.但是那个result被反转赋值为list的下标公式可真难。
这个代码来自:
#include<iostream> #include<algorithm> using namespace std; int list[100010]; int node[100010][2]; int main() { int st,num,r; cin>>st>>num>>r; int address,data,next,i; for(i=0;i<num;i++) { cin>>address>>data>>next; node[address][0]=data; node[address][1]=next; } int m=0,n=st; while(n!=-1) { list[m++]=n; n=node[n][1]; } i=0; while(i+r<=m) { reverse(list+i,list+i+r); i=i+r; } for (i = 0; i < m-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]); }
//这个和上边的思想类似,都是使用数组来存储。
1.data是通过二维数组中的第一维来表示,(其实都一样),均是通过地址下标找到的。
2.使用了reverse函数,没想到可以用reverse函数,队医一维数组来说。
while(i+r<=m) { reverse(list+i,list+i+r); i=i+r; }
//厉害。