编辑代码

function LinkNode(val) {
    this.prev = this.next = null
    this.val = val
}

LinkNode.formArray = (arr) => {
    let head = null, prev = null
    arr.map(r => {
        let node = new LinkNode(r)
        if (!head) head = node
        prev ? prev.next = node : ''
        prev = node
    })
    return head
}
LinkNode.prototype.toString = function () {
    let arr = []
    let head = this
    while (head) {
        arr.push(head.val)
        head = head.next
    }
    console.log(arr.join(' -> '))
    return arr
}

let reverse = (node) => {
    if (node.next) {
        let nNode = reverse(node.next)
        node.next.next = node
        node.next = null
        return nNode
    }
    else return node
}
LinkNode.reverse = function (head) {
    return reverse(head)
}

// 反转链表
LinkNode.prototype.reverse = function () {
    let head = this
    return reverse(head)
}

// test
let l = LinkNode.formArray([1, 2, 'a', 'b', 'c'])
l.toString()
let n = l.reverse()
n.toString()


// K个一组反转链表
LinkNode.prototype.reverseKnodes = function (k) {
    let head = last = this
    let ind = 1
    while (ind < k) {
        last = last.next
        if (!last) break
        ind++
    }
    // 不够一组
    if(k != ind) return head

    let nextHead = last ? last.next : null
    last.next = null
    let h = LinkNode.reverse(head)

    head.next = nextHead ? nextHead.reverseKnodes(k) : null
    return h
}

// test
l = LinkNode.formArray([1, 2, 'a', 'b', 3])
n = l.reverseKnodes(2)
n.toString()