本題鏈結
給定乙個常數 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
輸出格式:
對每個測試用例,順序輸出反轉後的鍊錶,其上每個結點佔一行,格式與輸入相同。
輸入樣例:
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
寫在前面的廢話:
第一次做這種給出位址的鍊錶題很不習慣,看完題目,鍊錶?反轉?這不剛學完資料結構嗎哈哈哈,頭插法搞起來…於是寫完反轉函式一跑,指標都飛到天上去了…硬著頭皮把 bug 都修完了去看了柳神的思路,頓時感覺自己把路走窄了。於是領會了一下核心思想,自己又重寫了一版,雖然做不到那麼精煉,但還是寫一下自己的步驟吧。
步驟:開乙個長度100010
的大陣列nodes
接收所有結點,用head
記錄頭結點位址;
從head
開始遍歷一遍鍊錶,把結點的位址按照順序存放在陣列linklist
裡;
在陣列linklist
裡按照題意把整個鍊錶反轉好;
根據linklist
裡此時的順序輸出結點(注意這個時候不需要做額外的事情了,第i
個結點的位址就是linklist[i]
,資料是nodes[linklist[i]].data
,下乙個結點的位址是linklist[i+1]
)
坑點:在陣列裡反轉
#include
#define max 100010
typedef
struct
node;
node nodes[max]
;// 接收輸入
int linklist[max]
;// 存放所有鍊錶結點的位址
void
reverse
(int
*a,int len)
}int
main()
int p = head, cnt =0;
while
(p !=-1
)int done =0;
while
(done + k <= cnt)
for(i =
0; i < cnt;
++i)
return0;
}
頭插法(最早寫的,感興趣可以看看)#include
#define max 100010
typedef
struct
node;
node nodes[max]
;int
count
(int head)
return cnt;
}// 修改 head 的後 1 個結點到 head 的後 len 個結點的 next
// 並且返回 head 的後 1 個結點的位址
// 例如對於 1 →2 →3 →4 →5 →6,reverse( 2 的位址, 3)後
// 鍊錶變成 1 →2 →5 →4 →3 →6,並返回 3 的位址
intreverse
(int head,
int len)
nodes[ret]
.next = p;
return ret;
}void
print
(int head)
}int
main()
int cnt =
count
(head)
;// 統計總結點個數
int done =0;
// 記錄已經處理好的節點個數
nodes[
100000]=
;// 造乙個真正的頭結點
int p =
100000
;// 用 p 遍歷鍊錶
while
(done + k <= cnt)
print
(nodes[
100000
].next)
;return0;
}
PAT 乙級 1025 反轉鍊錶
給定乙個常數 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 個測試用例。每個測試用例...
PAT 乙級 1025 鍊錶反轉
給定乙個常數 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 個測試用例。每個測試用例...
PAT乙級 1025 反轉鍊錶
問題描述 給定乙個常數 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 個測...