funcreverseKGroup(head *ListNode, k int) *ListNode { if head == nil || head.Next == nil || k == 1 { return head }
dummyHead := &ListNode{ Next: head, }
first := dummyHead
var prev, end *ListNode cur := dummyHead.Next
for { end = first for i := 0; i < k; i++ { end = end.Next if end == nil { break } } if end == nil { break } tmp := first.Next cur = tmp.Next prev = tmp for cur != nil && cur != end.Next { tmp2 := cur.Next cur.Next = prev prev = cur cur = tmp2 } first.Next = end tmp.Next = cur
first = tmp }
return dummyHead.Next }
这个版本的主要问题出现在翻转链表的循环条件中:
1 2 3 4 5 6
for cur != nil && cur != end.Next { tmp2 := cur.Next cur.Next = prev prev = cur cur = tmp2 }
错误原因: 在翻转链表的过程中,我们修改了节点的 Next 指针。当我们在循环中检查 cur != end.Next 这个条件时,由于 end 是链表中的一个节点,其 Next 指针可能在循环过程中被修改,导致循环终止条件不符合预期。
funcreverseKGroup(head *ListNode, k int) *ListNode { if head == nil || head.Next == nil || k == 1 { return head }
dummyHead := &ListNode{ Next: head, }
first := dummyHead
var prev, end *ListNode cur := dummyHead.Next
for { end = first for i := 0; i < k; i++ { end = end.Next if end == nil { break } } if end == nil { break } tmp := first.Next cur = tmp.Next prev = tmp afterEnd := end.Next for cur != nil && cur != afterEnd { tmp2 := cur.Next cur.Next = prev prev = cur cur = tmp2 } first.Next = end tmp.Next = cur