Skip to content

链表翻转类型题:

初级:

ts
const reverse = (head: ListNode ) =>{
    
    let dummy = new ListNode();
    dummy.next = haed;
    let cur = head;

    while(cur){
        let nxt = cur.next;

        cur.next = pre;

        pre = cur;
        cur = nxt;
    }

    return dummt.next;
}

中级:

https://leetcode.cn/problems/reverse-linked-list-ii/description/

ts
function reverseBetween(head: ListNode | null, left: number, right: number): ListNode | null {
    
    let dummy = new ListNode();
    dummy.next = head;


    let p0 = dummy;
    for(let i=0;i<left-1;i++){  // 使用p0找到翻转节点的前一个节点
        p0 = p0.next;
    }

    // 移动一下cur
    let cur = p0.next; // cur是翻转节点的第一个节点
    let pre = null; // 翻转节点的前一个节点

    for(let i=0;i<right-left+1;i++){
        let nxt = cur.next

        cur.next = pre;

        pre = cur;
        cur = nxt;
    }
    // p0指的是翻转节点的前一个节点
    // 对照样例,p0.next是2
    // 2应该指向5, 此时cur是5,所以 p0.next.next = cur
    p0.next.next = cur;
    p0.next = pre;

    return dummy.next;
};

高级:

  1. k个一组翻转链表
ts
function reverseKGroup(head: ListNode | null, k: number): ListNode | null {
    let dummy = new ListNode();
    dummy.next = head;

    let cur = head;
    let n = 0;

    // 获取长度
    while(cur){
        n++;
        cur = cur.next;
    }

    // 分组,确定次数
    let len = Math.floor(n/k);
    let p0 = dummy;

    for(let i=0;i<len;i++){
        let pre = null; // 重置
        cur = p0.next; // 每一轮的cur是p0的下一个节点

        for(let i=0;i<k;i++){
            let nxt = cur.next; // 交换三步走,同上一题

            cur.next = pre;

            pre = cur;
            cur = nxt;
        }

        let nxt = p0.next; // 本轮交换的第一个节点,是下一次交换的上一个节点,也就是下一次交换的p0;

        p0.next.next = cur; // 重置p0的next. 具体指向参考上一题:
        p0.next = pre; // 重置cur

        p0 = nxt; // 同 let nxt = p0.next;;
    }
    return dummy.next;
};
本站访客数 457 人次 本站总访问量 946
加载失败