[LeetCode] Reverse Nodes in k-Group
Well, since the head pointer may also be modified, we create a new_head that points to it to facilitate the reverse process.
For the example list 1 -> 2 -> 3 -> 4 -> 5 in the problem statement, it will become 0 -> 1 -> 2 -> 3 -> 4 -> 5 (we init new_head -> val to be 0). Then we set a pointer pre to new_head and another cur to head. Then we insert cur -> next after pre for k - 1 times if the current nodecur has at least k nodes after it (including itself). After reversing one k-group, we update pre to be cur and cur to be pre -> next to reverse the next k-group.
The code is as follows.
1 class Solution { 2 public: 3 ListNode* reverseKGroup(ListNode* head, int k) { 4 if (!hasKNodes(head, k)) return head; 5 ListNode* new_head = new ListNode(0); 6 new_head -> next = head; 7 ListNode* pre = new_head; 8 ListNode* cur = head; 9 while (hasKNodes(cur, k)) { 10 for (int i = 0; i < k - 1; i++) { 11 ListNode* temp = pre -> next; 12 pre -> next = cur -> next; 13 cur -> next = cur -> next -> next; 14 pre -> next -> next = temp; 15 } 16 pre = cur; 17 cur = pre -> next; 18 } 19 return new_head -> next; 20 } 21 private: 22 bool hasKNodes(ListNode* node, int k) { 23 int cnt = 0; 24 while (node) { 25 cnt++; 26 if (cnt >= k) return true; 27 node = node -> next; 28 } 29 return false; 30 } 31 };

浙公网安备 33010602011771号