PAT(Python)-1025:反轉連結串列(25)
阿新 • • 發佈:2019-02-17
給定一個常數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 |