这题难度是hard,但解法并没什么复杂度,主要是边界判定,所以直接上代码了
func reverseKGroup(head *ListNode, k int) *ListNode {
if k == 1 || head == nil {
return head
}
var n int
head = &ListNode{Next: head}
pre := head
for node := head.Next; node != nil; {
n++
// 每次需要翻转的一组
if n == k {
// p.N -> 1,2,|| 3,4,|| 5 k = 2
tmp := pre.Next // tmp = 1,翻转后 1.Next = 3
pre.Next = reverse(pre.Next, node) // p.Next = 2
pre = tmp // pre = 1
node = tmp.Next // node = 1.Next = 3
n = 0
continue
}
node = node.Next
}
return head.Next
}
func reverse(h,t *ListNode) *ListNode {
var pre *ListNode
// 1,2,3,4, 需要换成3,2,1,4,则tail=4
tail := t.Next // 这里是4
// 这里不能靠nil判断,因为只是链表的一段,所以拿tail=4判断
for node := h; node != tail; {
tmp := node.Next
node.Next = pre
pre = node
node = tmp
}
// 这里需要注意的是,外面还是要继续遍历链表的,不能把4弄丢了,故把 1.Next = 4
h.Next = tail
return pre
}