這道題的核心演算法是:翻轉k個值。
舉個例子:如何翻轉 1 2 3 4 這四個數字。我的第一想法就是 1 和 4 交換,然後指向1 4 的序號左移右移變成指向 2 3 的序號,然後讓2 3 交換。
但是,實際這種反轉演算法是符合人腦不符合計算機思考的。1 和 4的交換和2 和 3的交換它們的操作不同。在鍊錶中1和4的交換要修改4個指標。2和3的交換是相鄰結點的交換,要交換的指標是3個。所以不能想當然的將翻轉演算法寫成這種方式。
還有一種反轉演算法,這種演算法才是符合規矩的操作。還是用1 2 3 4舉例,翻轉的操作應該為:第一步,將1放到4的後面變成2 3 4 1第二步,將2放到4的後面變成3 4 2 1,第三步將3放到4的後面變成4 3 2 1。這樣整個翻轉操作就完成了。這種操作,每一步都遵循相同的步驟,因此可以抽象成乙個演算法,乙個模板。
所以,演算法的關鍵是找到待翻轉的一組數值的前乙個數值pre,如1 2 3 4這組數前乙個數值設為0。待翻轉的一組數值中的最後乙個數值end,如4。讓每乙個待翻轉的一組數值中的第乙個數值,也就是pre.next,放到end的後面,這樣一次迴圈就完成,進行下一次迴圈。
class solution {
public listnode reversekgroup(listnode head, int k) {
listnode dummy = new listnode(-1);
dummy.next = head;
listnode end = dummy;
listnode pre = dummy;
listnode cur;
while ( true ) {
int i = 0;
while ( end!=null && i總結:一道題的核心就是他的核心演算法,比如這道題的核心就是翻轉演算法,所以寫一道題的第一步首先要思考如何寫出核心演算法,然後剩餘部分再寫。
核心演算法中的重點是有幾個核心的點。這些核心的點有可能是某些值,某些位置等等。翻轉演算法中核心的點就是兩個位置:乙個pre乙個end,pre是每一組待翻轉數值的前面的乙個數值,end是每一組待翻轉數值中最後那個數值,每一次迴圈都是讓pre.next放到end的後面,直到pre.next為end。然而在上一道題兩兩交換鍊錶中的結點的演算法中核心的點是兩個數值:乙個是head乙個是head.next,每一次交換都是在pre head head.next之間進行交換,所以要保證head和head.next不為null。
25 k個一組翻轉鍊錶
給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 ...
25 K 個一組翻轉鍊錶
題目.有意思可以拆解為3個子問題 另外變數和邏輯比較多容易搞混,最好多定義幾個臨時變數 package main import fmt type listnode struct func printlist root listnode fmt.println func reverse head li...
25 K 個一組翻轉鍊錶
給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給你這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1...