25 reverse-nodes-in-k-group
阿新 • • 發佈:2018-11-08
這道題的大意是說,給一個連結串列,再給一個整型數字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; } };