ZBLOG

/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reverse(head, tail *ListNode) *ListNode { node := head for node != tail { tmp := node.Next node.Next = t...

超出时间限制可能是因为在每次反转 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=11438

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?