超出时间限制可能是因为在每次反转 k 个节点后,你使用循环移动 resultnode
到下一个位置的方式不够高效。这导致了整体的时间复杂度变高。
以下是改进后的代码,使用一个额外指针 prevTail
来记录上一次反转后的尾部节点,直接连接到当前反转段的头部:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverse(head, tail *ListNode) (*ListNode, *ListNode) {
node := head
var prev, next *ListNode
for node != nil {
next = node.Next
node.Next = prev
prev = node
if node == tail {
break
}
node = next
}
return tail, head
}
func reverseKGroup(head *ListNode, k int) *ListNode {
result := &ListNode{}
resultNode := result
node := head
prevTail := result // 记录上一次反转的尾部节点
for node != nil {
count := 1
tmpHead := node
for count < k && node != nil {
count++
node = node.Next
}
if count < k || node == nil {
prevTail.Next = tmpHead // 剩余不足 k 个节点,直接连接到结果链表末尾,结束循环
break
}
tmpNext := node.Next // 暂存下一段未处理节点的起始位置
newHead, newTail := reverse(tmpHead, node) // 反转当前段的节点
prevTail.Next = newHead // 连接到结果链表末尾
prevTail = newTail // 更新上一次反转的尾部节点
node = tmpNext // 继续下一段的处理
}
return result.Next
}
通过记录上一次反转后的尾部节点,直接连接到当前反转段的头部,避免了循环移动 resultnode
的过程,提高了效率。希望这次能够解决超时问题。请再次注意在实际使用中进行充分测试和验证代码逻辑的正确性。
内容由零声教学AI助手提供,问题来源于学员提问