LeetCode in Racket

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

; Definition for singly-linked list:
#|

; val : integer?
; next : (or/c list-node? #f)
(struct list-node
  (val next) #:mutable #:transparent)

; constructor
(define (make-list-node [val 0])
  (list-node val #f))

|#

(define (reverse-k l k next)
  (if (or (= 0 k) (not l)) next
      (let ([n (list-node-next l)])
        (set-list-node-next! l next)
        (reverse-k n (- k 1) l))))
		
(define (reverse-group-k h c k i)
  (cond [(= i k) (reverse-k h k (reverse-group-k c c k 0))]
        [(not c) h]
        [else (reverse-group-k h (list-node-next c) k (+ 1 i))]))
		
(define (reverse-k-group head k) (reverse-group-k head head k 0))