給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。
k 是乙個正整數,它的值小於或等於鍊錶的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
思路一:這個題與之前兩兩交換鍊錶中的節點很像,只是這次不再是相鄰結點交換了,但思路都差不多一樣,也是用三個指標來做,思路是先讓pre指標指向頭節點dummy,然後根據k的值對鍊錶遍歷,讓cur指標指向第k個結點的下乙個結點,比如對於-1->1->2->3->4->5,k=3來說,pre就指向-1,cur指向3,我們要做的就是翻轉pre和cur之間的鍊錶,使其變為-1->3->2->1->4->5,那麼我們可以專門寫乙個函式來完成這個事情,那麼每次只要固定好pre和cur,就可以呼叫這個函式來完成翻轉的工作。
這個函式該怎麼寫呢?主要思路就是使用三個指標pre、last和cur,分別指向-1,1和2,然後每次都是把cur放到pre後面,讓last的next指向cur的next就行了,比如當完成第一次翻轉後,鍊錶就變為了-1->2->1->3->4->5,這時我們的pre、last和cur分別對應的結點是-1、1和3,把cur的3放到pre後面,然後同樣讓last的next指向cur的next,鍊錶就變為了-1->3->2->1->4->5,如果k為3,則本次翻轉就結束了。
注意是思路要清晰,在紙上畫個鍊錶多寫寫就會發現規律。
class
solution
else
cur=cur-
>next;
}return dummy-
>next;
} listnode*
fanzhuan
(listnode* pre,listnode* next)
return last;}}
;
方法二:與思路一相同,只不過放到了同乙個函式中實現。首先遍歷整個鍊錶,統計出鍊錶的長度,然後如果長度大於等於k,交換節點,當 k=2 時,每段只需要交換一次,當 k=3 時,每段需要交換2此,所以i從1開始迴圈,注意交換一段後更新 pre 指標,然後 num 自減k,直到 numclass
solution
pre = cur;
num -
= k;
}return dummy-
>next;}}
;思路三:也可以使用遞迴來做,用 head 記錄每段的開始位置,cur 記錄結束位置的下乙個節點,然後呼叫 reverse 函式來將這段翻轉,然後得到乙個 new_head,原來的 head 就變成了末尾,這時候後面接上遞迴呼叫下一段得到的新節點,返回 new_head 即可,其實翻轉鍊錶的思想都是一樣的
class
solution
listnode *new_head =
reverse
(head, cur)
; head-
>next =
reversekgroup
(cur, k)
;return new_head;
} listnode*
reverse
(listnode* head, listnode* tail)
return pre;}}
;
LeetCode題解 25 K 個一組翻轉鍊錶
給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1...
leetcode 鍊錶 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個一組翻轉鍊錶
給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 ...