题目描述: alt

解题思路:

题目总体思路不难,考的是代码能力和思路

同上一道题目,先设头结点 在函数reverseKGroup中设temp来记步长k,再调用reverseList函数来实现规定区间内的链表翻转,具体见代码

代码示例:

function reverseKGroup( head ,  k ) {
    // write code here
    // 特殊情况
    if(head == null || head.next == null || k == 1) {
        return head
    }
    
    let res = new ListNode(-1);
    res.next = head;
    let cur = res;
    while(head !=null) {
        let temp = cur;
        
        // 查看剩余部分长度是否大于K
        for(let i = 0; i < k; i++) {
            temp = temp.next; // 使temp节点指向k步
            if(temp == null) { // 表示若走到链表最后则直接返回,无需后续操作
                return res.next
            }
        }
        let nxt = temp.next; //因为要实现翻转,过程会丢失下一个链表节点,因此在实现翻转前,先保留下一个节点
        [head, temp] = reverseList(head, temp);
        
        // 把翻转过后的链表接到原链表上
        cur.next = head;
        // 刷新节点信息,为下一次循环操作做准备
        temp.next = nxt;
        cur = temp;
        head = temp.next
    }
    return res.next
}

// 实现链表翻转
function reverseList(head, temp) { // 1->2->3
    let pre = temp.next; // 保留翻转区间内下一个位置,为while条件判断终止条件
    let res = null;
    let cur = head;
    while(cur != pre) { // 开始区间内的翻转
        let Temp = cur.next;
        cur.next = res;
        res = cur;
        cur = Temp;
    }
    // 返回修改后的链表结构 1<-2<-3
    return [temp, head]
}