寫在前面
- leetcode刷題筆記心得總結,原諒年紀大不總結很快就忘記的毛病…
- 主要目的:提升數據結構與算法能力,畢竟實際開發中可能遇到深層次的算法問題
- 主要收穫:數據結構、算法思想(此處敲黑板)
題目描述
給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。
k 是一個正整數,它的值小於或等於鏈表的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
說明:
算法只能使用常數的額外空間。
不能只是單純的改變節點內部的值,而是需要實際進行節點交換。
ac代碼
- 解題思想
- 遞歸解決子問題(reverseKGroup)
- 子鏈表翻轉
class Solution
{
public:
ListNode* reverseKGroup(ListNode* head, int k)
{
int cnt = 0;
ListNode* ends = head;
while(ends && ++cnt < k)
ends = ends->next;
if(cnt<k) return head;
ListNode* tmp = ends->next;
ends->next = NULL;
reverseK(head);
head->next = reverseKGroup(tmp, k);
return ends;
}
void reverseK(ListNode* head)
{
ListNode* pre = NULL, *cur = head, * pxt;
while(cur)
{
pxt = cur->next;
cur->next = pre;
pre = cur;
cur = pxt;
}
}
};