JS 链表内指定区间反转

代码

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
function reverseBetween(head, m, n) {
    
    
    if (m === n) {
    
    
        return head;
    }
    // write code here
    let myHead = head;
    for (let i = 1; i < m; i++) {
    
    
        myHead = myHead.next;
    }
    console.log("myHead", myHead);

    let pHead = head;
    for (let i = 1; i < m-1; i++) {
    
    
        pHead = pHead.next;
    }
    console.log("pHead", pHead);

    let myTail = myHead;
    for (let i = m; i < n; i++) {
    
    
        myTail = myTail.next;
    }
    console.log("myTail", myTail);

    let p = myHead;
    let pre = null;
    let tail = myTail.next;
    while (p != tail) {
    
    
        let nex = p.next;
        p.next = pre;
        pre = p;
        p = nex;
    }
    myHead.next = tail;
    if (head != myHead) {
    
    
        pHead.next = myTail;
        return head;
    } else {
    
    
        return myTail;
    }
}

解题思路

1、如果 m=n 那么直接就是不反转,返回头节点
2、找到需要反转的链表第m个节点myHead和第n个节点myTail;找到myHead反转节点的前一个节点(pHead)和myTail反转节点的后一个节点(tail)

在这里插入图片描述

3、将m到n的节点反转,直接按照反转链表的解题思路就行

let pre = null;
let p = myHead;
while (p != tail) {
    
    
   let nex = p.next;
   p.next = pre;
   pre = p;
   p = nex;
}

进行到这一步,会变成3条链表
分别是:
1 -> null
4 -> 3 -> 2
5->null

4、将这三条链表连起来
pHead连接反转后的链表
1 -> 4 -> 3 -> 2
反转后的链表连接tail
1 -> 4 -> 3 -> 2 -> 5

猜你喜欢

转载自blog.csdn.net/qq_45634989/article/details/130525722