【leetcode】25. K 个一组翻转链表

59 阅读1分钟

leetcode-25.png

92题、206题都为此类型反转链表题目 这一题要处理下最后不足k个的情况,然后注意这个反转是带有终点的,也就是right节点,注意判断好跳出条件即可

var reverseKGroup = function (head, k) {
    if (head === null) return head
    let left = head, right = head
    for (let i = 0; i < k; ++i) {
        // 不足k个,肯定会遇到 right = null
        if (!right) return head
        right = right.next
    }
    // 第一次反转后获取到的list,list为头节点
    let list = reverse(left, right)
    // left 节点变成了右边的节点,然后衔接下一次递归的链表
    // right 为下一次链表的起始点
    left.next = reverseKGroup(right, k)
    return list
};

// 反转left和right之间的链表
var reverse = function (left, right) {
    let pre = null, current = left
    while (current !== right) {
        let nextNode = current.next
        current.next = pre
        pre = current
        current = nextNode
    }
    return pre
}

不足k个也进行反转

var reverseKGroup = function (head, k) {
    if (!head) return head
    let left = head, right = head
    for (let i = 0; i < k; ++i) {
        // 直接在此处break
        // 此时right走到最右端
        if (!right) break
        right = right.next
    }
    let list = reverseList(left, right)
    left.next = reverseKGroup(right, k)
    return list
};

var reverseList = function (left, right) {
    let pre = null, current = left
    while (current !== right) {
        let nextNode = current.next
        current.next = pre
        pre = current
        current = nextNode
    }
    return pre
}