1 minute read

<-H 25> Reverse Nodes in k-Group

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
// Method 1
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head == nullptr || head->next == nullptr || k < 2)
            return head;
        ListNode temp(-1);
        temp.next = head;
        for(ListNode *prev = &temp, *end = head;
           end;
           end = prev->next) {
            for(int i = 1; i < k && end; i++)
                end = end->next;
            if(end == nullptr)
                break;

            prev = reverse(prev, prev->next, end);
        }
        return temp.next;
    }
private:
    ListNode *reverse(ListNode *prev, ListNode *begin, ListNode *end) {
        ListNode *end_next = end->next;
        for(ListNode *p = begin, *cur = p->next, *next = cur->next;
           cur != end_next;
           p = cur, cur = next, next = next ? next->next : nullptr) {
            cur->next = p;
        }
        begin->next = end_next;
        prev->next = end;
        return begin;
    }
};

// Method 2
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {

       if(head == NULL)
           return head;

        ListNode* temp = head;
        for(int i = 0; i < k; i++) {
            if(temp == NULL)
                return head;
            temp = temp->next;
        }

       ListNode *prev = NULL;
       ListNode *curr = head;
       ListNode *next;
       int count = 0;

       while(curr != NULL && count < k) {
           next = curr->next;
           curr->next = prev;
           prev = curr;
           curr = next;
           count++;
       }
       if(next != NULL) {
           head->next = reverseKGroup(next,k);
       }
       return prev;
    }
};