# Reverse Nodes in k-Group

#1

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.

Example:

Given this linked list: `1->2->3->4->5`

For k = 2, you should return: `2->1->4->3->5`

For k = 3, you should return: `3->2->1->4->5`

Note:

• Only constant extra memory is allowed.
• You may not alter the values in the list's nodes, only nodes itself may be changed.

#2

The logic in the below code involves breaking up the list into `k` parts and reversing them individually.

``````func reverseKGroup(head *ListNode, k int) *ListNode {
th := &ListNode{Val : 0, Next: head}
cur := th

for cur.Next != nil{
start := cur.Next
end := cur.Next

for i:=1;i<k&&end!=nil;i++{ end = end.Next } // move end k times
if end==nil{
break
}

next := end.Next
end.Next = nil

// reverse the kth part of the list
t:= start
var prev *ListNode
for t!=nil{
next := t.Next
t.Next = prev
prev = t
t = next
}

cur.Next = end
start.Next = next

cur = start
}

return th.Next
}
``````