K 个一组翻转链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseKGroup(head *ListNode, k int) *ListNode {
	tail := peekK(head, k)
	if tail == nil {
		return head
	}
 
	var (
		res = tail
		prevHead *ListNode
		nextHead *ListNode
	)
	for tail != nil {
		if prevHead != nil {
			prevHead.Next = tail
		}
		nextHead = tail.Next
		tail.Next = nil
		reverse(head)
		prevHead = head
		head = nextHead
		tail = peekK(head, k)
	}
	if prevHead != nil {
		prevHead.Next = head
	}
 
	return res
}
 
func peekK(head *ListNode, k int) (tail *ListNode) {
	k--
	for head != nil && k > 0 {
		head = head.Next
		k--
	}
	if k == 0 && head != nil {
		return head
	}
	return nil
}
 
func reverse(head *ListNode) {
	var (
		prev *ListNode
		next *ListNode
	)
 
	for head != nil {
		next = head.Next
		head.Next = prev
		prev = head
		head = next
	}
}