把当时的代码放出来,大家共同学习,互相帮助
题目:
输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
由于俺写这道题时对链表还不太清楚,并且之前还没做过这种类型的题,不知道怎么处理,以至于花了很长时间却还是没做出来,在网上看了柳婼小姐姐以及玮智能老哥的代码才知道了思路。
俺当时一直想要直接修改指针的指向来达到反转,但是这样写太麻烦不太可行。只需要用数组顺序存储地址,然后顺序遍历数组就能模拟链表(话说学过数据结构的应该都知道吧,汗),数组大小100000就可,因为题中地址为0~99999,数组元素索引对应每个地址,这样非常方便。
尝试把柳婼小姐姐的代码用Python实现,最后发现跟网上很多人一样,测试点5有时候超时、有时候非零返回,代码如下:
first, n, k = map(int, input().split()) # 首地址,节点数,每次反转长度
data, next, list = [None] * 100000, [None] * 100000, [None] * 100000 # 创建数组在对应地址存储节点号,下一节点地址
for i in range(n):
add, data[add], next[add] = map(int, input().split())
sum, add = 0, first
while add != -1: # 循环直到没有下一个节点为止(-1为标志)
if next[add] is None: # 如果根据节点地址匹配不到下一个节点(地址),则表示链表到此终止。跳出循环,不再进行以下操作
break
list[sum] = '%05d' % add # 按格式及链表顺序存储各节点地址到list
add = next[add] # 更新下一个节点地址
sum += 1
for j in range(k-1, sum, k): # 对k个地址对称地交换位置,得到反转后的节点地址
i = j-k+1
while i < j:
list[i], list[j] = list[j], list[i]
i += 1
j -= 1
list[sum] = '-1' # 添加末尾表示什么都不指向的-1
for i in range(sum): # 按格式输出排序后的结果
print("%s %d %s" % (list[i], data[int(list[i])], list[i + 1]))
附小姐姐c++代码,不过不知道为啥俺的dev c++编译报错,vs c++编译通过运行失败,如下图,而在PAT上就ok,编译器原因??
dev c++编译出错,可以尝试点击这里解决
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int first, k, n, temp;
cin >> first >> n >> k;
int data[100005], next[100005], list[100005];
for (int i = 0; i < n; i++) {
cin >> temp;
cin >> data[temp] >> next[temp];
}
int sum = 0;//不一定所有的输入的结点都是有用的,加个计数器
while (first != -1) {
list[sum++] = first;
first = next[first];
}
for (int i = 0; i < (sum - sum % k); i += k)
reverse(begin(list) + i, begin(list) + i + k);
for (int i = 0; i < sum - 1; i++)
printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);
return 0;
}