LeetCode-in-All

25. Reverse Nodes in k-Group

Hard

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes, in the end, should remain as it is.

You may not alter the values in the list’s nodes, only nodes themselves may be changed.

Example 1:

Input: head = [1,2,3,4,5], k = 2

Output: [2,1,4,3,5]

Example 2:

Input: head = [1,2,3,4,5], k = 3

Output: [3,2,1,4,5]

Example 3:

Input: head = [1,2,3,4,5], k = 1

Output: [1,2,3,4,5]

Example 4:

Input: head = [1], k = 1

Output: [1]

Constraints:

Follow-up: Can you solve the problem in O(1) extra memory space?

Solution

use leetcode\com_github_leetcode\ListNode;

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */
class Solution {
    /**
     * @param ListNode $head
     * @param Integer $k
     * @return ListNode
     */
    public function reverseKGroup($head, $k) {
        if ($this->countNodesInList($head) < $k || $head->next == null || $head == null) {
            return $head;
        } else {
            $curr = $head;
            $prev = null;
            $next = $curr->next;
            $index = 0;
            while ($curr != null && $index < $k) {
                $curr->next = $prev;
                $prev = $curr;
                $curr = $next;
                $next = $next->next;
                $index++;
            }
            // now $prev is the first group inverted
            // and next is pointing to the start of next group to be inverted
            if ($curr != null) {
                $head->next = $this->reverseKGroup($curr, $k);
            }
            return $prev;
        }
    }

    function countNodesInList($head) {
        $count = 0;
        $p = $head;
        while ($p != null) {
            $count++;
            $p = $p->next;
        }
        return $count;
    }
}