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:
sz
.1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz
Follow-up: Can you solve the problem in O(1) extra memory space?
; 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))