鍊錶的K組翻轉問題

2021-08-04 21:23:00 字數 1210 閱讀 4913

在這兩天的刷題中,遇到乙個求鍊錶的翻轉問題,坦白講,這個問題我想得思路有很多種,但在這麼多種的思路中,沒有乙個是能夠輕易實現的。題目如下。

鍊錶翻轉。給出乙個鍊錶和乙個數k,比如鍊錶1→2→3→4→5→6,k=2,翻轉後2→1→4→3→6→5,若k=3,翻轉後3→2→1→6→5→4,若k=4,翻轉後4→3→2→1→5→6,用程式實現node* rotatelist(node* list, size_t k).

最開始,我想得第一種解法是在區間內進行交換,但是這是乙個鍊錶,只能next,不能head++,tail–。於是這種思路報廢。第二種,是區域性進行逆置,但是在逆置的時候,容易出現的問題,且不能保證程式能一直執行起來,對起始結點和尾結點沒法進行迴圈。第三種,是在乙個迴圈條件中反覆判斷,判斷的條件和需要注意的細節太多,這種思路也只能想想。最後一種,也就是我接下來要講的這種,遞迴進行翻轉,把乙個大問題不斷化簡成小問題,然後再去一一串起來。

整體步驟如下圖所示。

剩下的結點遞迴的原理和上圖一樣,就不贅餘了。講到這裡,對這個題的解題思路已經很明確了,原始碼如下。

size_t size(node* head)

return count;

}//思路:以k為一組進行逆置,然後進行遞迴

//每次儲存翻轉的最後乙個結點指向的下乙個

//最後把這些結點全部串起來

node* rotatelist(node* head, size_t k)

node* last = newhead;

while (last->_next !=

null) //找到最後乙個結點,儲存起來

last = last->_next;

node* nexthead = rotatelist(next, k); //對下乙個k組繼續進行逆置

last->_next = nexthead;

return newhead;

}

結果如下。

450 K組翻轉鍊錶

中文english 給你乙個鍊錶以及乙個k,將這個鍊錶從頭指標開始每k個翻轉一下。鍊錶元素個數不是k的倍數,最後剩餘的不用翻轉。example 1 input list 1 2 3 4 5 null k 2 output 2 1 4 3 5example 2 input list 1 2 3 4 5...

k個一組翻轉鍊錶

題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5當 k 2 時,應當返回 2 1 4 3 5當 k 3 時,應當返回 3 2 1...

leetcode25 k組翻轉鍊錶

這題可以參考206的答案,事實上,我直接把翻轉部分的 用了leetcode206官方題解上面的,只是做了一點小修改,以保證是前k個反轉 我們具體分析核心函式 reversekgroup 乙個關鍵是怎麼把這個問題分解成好幾個單獨的翻轉問題,我這裡的reverselist函式做了改動,只反轉前面k個節點...