在這兩天的刷題中,遇到乙個求鍊錶的翻轉問題,坦白講,這個問題我想得思路有很多種,但在這麼多種的思路中,沒有乙個是能夠輕易實現的。題目如下。
鍊錶翻轉。給出乙個鍊錶和乙個數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個節點...