PAT乙级 1025 反转链表

把当时的代码放出来,大家共同学习,互相帮助
题目:
在这里插入图片描述
输入样例:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~豆沙味的旺仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值