1. 程式人生 > >PAT(Python)-1025:反轉連結串列(25)

PAT(Python)-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(<= 105)、以及正整數K(<=N),即要求反轉的子鏈結點的個數。結點的地址是5位非負整數,NULL地址用-1表示。

接下來有N行,每行格式為:

Address Data Next

其中Address是結點地址,Data是該結點儲存的整數資料,Next是下一結點的地址。

輸出格式:

對每個測試用例,順序輸出反轉後的連結串列,其上每個結點佔一行,格式與輸入相同。

實際提交程式碼發現測試點5始終過不去,折騰了一天也不知道到底還有什麼問題沒考慮到,不知道有沒有人能給個提示或指出錯誤呢?
# -*- coding: utf-8 -*-
# 思路:從給定的鏈首到鏈末共有資料個數n加1項,id為前n項,next為後n項
def link(address,head,li):  # 採用遞迴將連結串列所用節點依次存入列表
    if head in address:
        arrow = address[head]
        li.append(arrow)
        return link(address,arrow,li)
    else:
        return li
head,N_all,cell = input().split()  # 讀取第一行輸入:首項元素id,元素個數N_all,反轉間隔cell
N_all,cell = int(N_all),int(cell)  # 將N與cell轉換為整數
address,data = {},{}  # 初始化兩個字典,其中address儲存id-next關係,data儲存id-data關係
for i in range(N_all):  # 將輸入資訊存入address和data中
    a,b,c = input().split()
    address[a],data[a] = c,b   
# 呼叫link()函式將所給資訊按連結順序存入id_plus,有N_all+1個元素,末項為鏈尾指標,指向未知id或為-1
id_plus = link(address,head,[head])  # 第三項必須為[head]而不是[],因為link()函式無法新增第一個id
id_plus[-1] = '-1'  # 指定鏈尾指標指向-1
N_e = len(id_plus) - 1  # id_plus中的元素個數為可連結到的元素,從首項到最後的-1,實際對應的資料個數應減1
num, rem = N_e // cell, N_e % cell  # 判斷要對那些資料進行反轉
if num:  # 可連結到的資料個數不小於反轉間隔
    for i in range(num):
        id_plus[(i*cell):((i+1)*cell)] = id_plus[(i*cell):((i+1)*cell)][::-1]  # 反轉
for k,v in enumerate(id_plus[:-1]):  # 按規定格式,列印id,data,next
    s = '{} {} {}'.format(v,data[v],id_plus[k+1])
    print(s)

測試點 結果 用時(ms) 記憶體(kB) 得分/滿分
0 答案正確 11 3100 12/12
1 答案正確 12 3052 3/3
2 答案正確 12 3056 2/2
3 答案正確 11 3220 2/2
4 答案正確 11 3056 2/2
5 返回非零 201 33244 0/3
6 答案正確 12 3056 1/1