leetcode-25-k個一組翻轉鏈表(c++)

寫在前面

  • leetcode刷題筆記心得總結,原諒年紀大不總結很快就忘記的毛病…
  • 主要目的:提升數據結構與算法能力,畢竟實際開發中可能遇到深層次的算法問題
  • 主要收穫:數據結構、算法思想(此處敲黑板

題目描述

給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。
k 是一個正整數,它的值小於或等於鏈表的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

說明:
	算法只能使用常數的額外空間。
	不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

ac代碼

  • 解題思想
    • 遞歸解決子問題(reverseKGroup
      • 分組翻轉
      • 每次更新子鏈表首尾節點
    • 子鏈表翻轉
      • 拆分單個節點進行逆序組裝(reverseK
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
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;    // 當次待翻轉節點數不足k個,即不用翻轉

        ListNode* tmp = ends->next; // 保存下1次需要翻轉的開始節點
        ends->next = NULL;  // 標識循環是否結束
        reverseK(head); // 開始第X次k個節點翻轉

        head->next = reverseKGroup(tmp, k); // 遞歸翻轉,每次翻轉 ends變爲開始節點
        return ends;
    }

    void reverseK(ListNode* head)
    {
        ListNode* pre = NULL, *cur = head, * pxt;
        while(cur)
        {
            pxt = cur->next;    // 反轉
            cur->next = pre;

            pre = cur;  // 移動下1次循環
            cur = pxt;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章