1. 程式人生 > >25 reverse-nodes-in-k-group

25 reverse-nodes-in-k-group

這道題的大意是說,給一個連結串列,再給一個整型數字K,要實現這個連結串列每K個數進行一次反轉,整條連結串列反轉的題目比較熟悉,但是,一個連結串列分成好幾組進行反轉其實大體思路是一樣的,但是每組反轉結束之後,應該如何變化指標進行下一次反轉,這是這道題的重點。

按照以前連結串列反轉的思路,我們首先要建立一個頭節點,用來記錄連結串列頭節點的位置。

其次,設定計數值,將每組的頭尾節點分別記錄,這塊要注意,最好要記錄每組頭節點的前一個節點,因為每組反轉後,每組原來的最後一個節點要變為第一個節點,也就是要讓上一組的最後一個節點指向它,所以,此處要記錄的是每組第一個元素的前一個元素的地址: dummy -> 1 -> 2 -> 3 -> 4 ->NULL,K=2,第一次記錄dummy和2,第二次記錄2和4,從而實現各組反轉。這塊想通了程式碼也就比較簡單了。

以下是我的程式碼:

/**
 * 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) {
        if (!head || k<2) {
            return head;
        }
        ListNode* dummy = new ListNode(0);
        ListNode* prev = dummy, *cur = head;
        dummy->next = head;
        int count = 1;        
        while (cur) {
            if (count%k) {
                cur = cur->next;
            } else {
                prev = reverseKNodes(prev, cur->next);
                cur = prev->next;
            }
            ++count;
        }
        return dummy->next;
    }
    
    ListNode* reverseKNodes(ListNode* prev, ListNode* next) {
        ListNode* head = prev->next;
        ListNode* cur = head->next;
        while (cur != next) {
            head->next = cur->next;
            cur->next = prev->next;
            prev->next = cur;
            cur = head->next;
        }
        return head;
    }
};