// 运用反转链表II来完成
/**
Definition for singly-linked list.
type ListNode struct {
Val intNext *ListNode-
}
*/
func reverseKGroup(head *ListNode, k int) *ListNode {
cur := head
len := 1
for head != nil {
head = head.Next
len++
}slow, fast := 1, k
res := cur
for fast < len {
res = reverseBetween(cur, slow, fast)
slow = fast + 1
fast += k
cur = res
}return res
}
// 返回反转后的头
func reverseBetween(head *ListNode, m int, n int) *ListNode {
i := 0
var last, begin *ListNode
head = &ListNode{
Next: head,
}
cur := head
for head != nil {
// i 表示到访过的第几个节点
if i > m {
if i <= n {
last.Next = head.Next
head.Next = begin.Next
begin.Next = head
head = last // head需要更新为last,注意这里很重要,对于链表反转来说
} else {
break
}
}
if i == m {
// head为当前节点,last为上一个
// begin表示反转的头的上一个
// last为反转的尾
begin = last
}
last = head
// 增加到访过的节点
head = head.Next
i++
}
return cur.Next
}