package q25 type ListNode struct { Val int Next *ListNode } func reverse(begin *ListNode, k int) (newHead, newTail *ListNode) { tail := begin for range k - 1 { if tail.Next == nil { return begin, tail // no enough nodes } tail = tail.Next } // Reverse cur := begin prev := tail.Next for range k - 1 { t := cur.Next cur.Next = prev prev, cur = cur, t } cur.Next = prev return cur, begin } func reverseKGroup(head *ListNode, k int) *ListNode { if k < 2 { return head } var ret, prevTail *ListNode p := head for p != nil { newHead, newTail := reverse(p, k) if ret == nil { ret = newHead } if prevTail != nil { prevTail.Next = newHead } prevTail = newTail p = newTail.Next } return ret } var _ = reverseKGroup