1025 反转链表 (25 分)
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。
输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤10^5 )、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。
接下来有 N 行,每行格式为:
Address Data Next
其中 Address
是结点地址,Data
是该结点保存的整数数据,Next
是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
---------------------------代码--------------------------------------
def ao(s):
lst = s.split()
fad = lst[0]
N, K = int(lst[1]), int(lst[2])
# 将数据都加入字典中
i = 0
d = {}
ada = []
while i < N:
t = input()
d[t.split(' ', 1)[0]] = t
i += 1
i = 0
nxt = fad
while i < N // K:
yw = 0
lst2 = []
j = 0
while j < K:
lst3 = d[nxt].split(' ')
ad = lst3[0]
nxt = lst3[2] # 此行代码导致测试点6非零返回, 非预期的遭遇'-1'导致, 此时应观察是否需要逆转,不需要的话,就不逆转
lst2.append(ad)
j += 1
if nxt == '-1' and j < K:
yw = 1
break
if yw == 0:
j = j - 1
while j >= 0:
ada.append(d[lst2[j]].rsplit(' ', 1)[0]) # 先加入列表
j -= 1
else: # 非预期遭遇'-1'且不满足逆转条件时不逆转
m = 0
while m < j:
ada.append(d[lst2[m]].rsplit(' ', 1)[0])
m += 1
if nxt == '-1':
break
i += 1
i = 0
while i < len(ada) - 1:
print(ada[i], ada[i + 1].split()[0]) # 列表中的顺序就是输出顺序,故将列表i的next就是i+1的address
i += 1
print(ada[i], nxt)
# 将多出的不用反转的部分输出
while nxt != '-1':
print(d[nxt])
nxt = d[nxt].split()[2]
---------------------解决过程------------------------------------------
开始该题在测试点6一直报非零返回,还没有输出返回,令人抓狂,后来我将代码一部分一部分的删除,将出错点定位到了代码中注释处。
在此处我首先怀疑是由于数据为''
,导致输入为'Address Next'
,使得lst只有两个,取lst[2]时指针越界,但经试验后,证明不是越界的问题。
后来我想到可能是nxt取得的值在下一次循环时,无法从字典中取得,但从上一次的next指针是指向下一个数据地址的,由next指针找不到数据,这不符合题意,所以next指针应为’-1’,这样才既满足题意又导致在字典中找不到元素。所以此处应是非预期的遭遇’-1’所致,做相应处理即可。
此代码在测试点5存在运行超时问题,希望有大佬给出本代码的优化方式,谢谢