PAT 乙級練習 1025 反轉鍊錶

2021-10-04 21:07:23 字數 2694 閱讀 7888

本題鏈結

給定乙個常數 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
輸出格式:

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

輸入樣例:

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 個測...