92. 反转链表 II(JS实现)

1 题目

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

2 思路

这道题思路主要是考察指针,并不是很难,只需要先找到要翻转元素的头和尾,然后头尾互换,并将其与原列表连接在一起,最后再翻转内部的元素即可

3代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} m
 * @param {number} n
 * @return {ListNode}
 */
var reverseBetween = function(head, m, n) {
    if (!head || !head.next || m === n) return head;
    let i = 1;
    let rHead,rTail;

    let linkHead = head;
    while(head) {    // 找到要翻转元素的头和尾
        if (m === i) rHead = head;
        if (n === i) {
            rTail = head;
            break;
        }
        if (head.next) head.next.prev = head;
        head = head.next;
        i++;
    }

    if (rHead.prev) {    //将翻转后元素的头连接到原列表
        rHead.prev.next = rTail;
    } else {
        linkHead = rTail;
    }
    rHead.next = rTail.next;   //将翻转后元素的尾连接到原列表

    i = n - m;
    while(i > 0) {    //将内部元素翻转
        rTail.next = rTail.prev;
        rTail = rTail.prev;
        i--;
    }

    return linkHead;
};

猜你喜欢

转载自blog.csdn.net/zjw_python/article/details/106869558