题目大意
给一个链表,要求将链表中的节点每 K K K个相反排列一次,并输出最后的链表
输入
每组包含一个测试用例
- 第一行,有链表的首地址, 一个正数 N ≤ 1 0 5 N\le10^5 N≤105表示节点的数量,一个正数 K ≤ N K\le N K≤N表示每 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//k∗k+k−i%k−1]
这样就完成了每
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()