PAT1 1074 Reversing Linked List

题目链接
我的github

题目大意

给一个链表,要求将链表中的节点每 K K K个相反排列一次,并输出最后的链表

输入

每组包含一个测试用例

  • 第一行,有链表的首地址, 一个正数 N ≤ 1 0 5 N\le10^5 N105表示节点的数量,一个正数 K ≤ N K\le N KN表示每 K K K个相反排序一次。
  • 之后有 N N N行,每一行都表示一个节点的信息,格式为Address Data Next,表示节点的地址,节点的值(整数),下个节点的地址

节点的地址都是一个非负整数,且表示的长度为5位,不足5位用前导0,空地址用-1表示

输出

对每个测试用例,输出最后的链表,每个节点为一行且格式与输入一致

样例输入

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

解析

因为所有节点的地址都是一个非负整数,且范围在 [ 0 , 99999 ] [0, 99999] [0,99999],所以这题可以用开一个大于这个范围的数组,下标表示节点的地址,值表示节点的值。
但是输入可能会有不是这个链表的节点,因此我们还要先遍历一次这个链表,剔除不需要的节点,然后将链表中的所有节点的地址按序保存在一个新的数组tmpNext里面。
这样对于最终的地址ansNext来说就有:
a n s N e x t [ i ] = t m p N e x t [ i / / k ∗ k + k − i % k − 1 ] ansNext[i] = tmpNext[i // k * k + k - i \% k - 1 ] ansNext[i]=tmpNext[i//kk+ki%k1]

这样就完成了每 K K K个逆序的操作,最后按照ansNext中的顺序输出每个节点就行

# -*- coding: utf-8 -*- 
# @Time : 2019/7/1 10:01 
# @Author : ValarMorghulis 
# @File : 1074.py
def solve():
    firstAddress, n, k = map(int, input().split())
    data = [-1 for i in range(100861)]
    next = [-1 for i in range(100861)]
    for i in range(n):
        address, d, ne = map(int, input().split())
        data[address] = d
        next[address] = ne
    tmpNext = list()
    ansNext = list()
    cnt = 0
    while firstAddress != -1:
        tmpNext.append(firstAddress)
        ansNext.append(firstAddress)
        cnt += 1
        firstAddress = next[firstAddress]
    for i in range(cnt - cnt % k):
        ansNext[i] = tmpNext[i // k * k + k - i % k - 1]
    for i in range(cnt - 1):
        print("%05d %d %05d" % (ansNext[i], data[ansNext[i]], ansNext[i + 1]))
    print("%05d %d -1" % (ansNext[cnt - 1], data[ansNext[cnt - 1]]))


if __name__ == "__main__":
    solve()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值