【路飞】leetcode 22 k一个组,反转列表

76 阅读1分钟

解法: 头插法

思路: k一个组,进行遍历,只要剩余节点大于等于k,即刻继续反转

要点: 开始前记录前一个节点,每组反转完成之后,前一个节点更新

var reverseKGroup = function(head, k) {
    let virDom = new ListNode(-1) // 虚拟头节点
    virDom.next = head
    let prev = virDom
    let cur = virDom.next
    let len = 0
    let eachKey = head
    while (eachKey) { // 获取总长度
        eachKey = eachKey.next
        len++ 
    }
    while((len = (len - k)) > -1) {
        for (let i = 0; i < k - 1; i++) { // 一个for循环为一组,一组循环结束后,在更新prev
            let next = cur.next
            cur.next = next.next
            next.next = prev.next
            prev.next = next
        }
        cur = cur.next // 上面的循环减了1,循环后cur+1,保持节点同步
        for (let i = 0; i < k; i++) { // 更新prev节点
            prev = prev.next
        }
    }
    return virDom.next
};