K个一组反转链表

// 运用反转链表II来完成
/**

  • Definition for singly-linked list.

  • type ListNode struct {

  • Val int
    
  • Next *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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容