92. 反转链表 II

126 阅读2分钟

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

image.png

思路:

1.首先我们定义一个虚拟头节点,起名叫做hair,将它指向我们的真实头节点。

2.定义一个指针pre指向虚拟头节点。

3.定义一个指针cur指向pre指针所指向节点的下一个节点。

4.让我们的pre指针和cur指针同时向后移动,直到我们找到了第m个节点

5.定义指针con和tail,con指向pre所指向的节点,tail指向cur指针所指向的节点。

6.con所指向的节点,将是我们将部分链表反转后,部分链表头节点的前驱节点。tail则是部

分链表反转后的尾节点。

7.开始我们的链表反转,首先定义一个指针third指向cur所指向的节点的下一个节点,然

后,将cur所指向的节点指向pre所指向的节点,将pre指针移动到cur指针所在的位置。将

cur指针移动到third指针所在的位置,直到我们的pre指针指向第n个节点

8.重复上述步骤

9.此时pre指针指向了第m个节点并且将第m到第n个节点之间反转完毕。

10.我们将con指针所指向的节点指向pre指针所指向的节点。

11.将tail指针所指的节点指向cur指针所指的节点,整理一下,显示出最终的链表。

代码

var reverseBetween = function (head, left, right) {

    if (!head) return null;

    let ret = new ListNode(-1, head), pre = ret, cnt = right - left+ 1;

while (--left) {

    pre = pre.next;

}

    pre.next = reverse(pre.next,cnt);

    return ret.next;

};

var reverse = function (head, n) {

let pre = null, cur = head;

while (n--) {

    [cur.next, pre, cur] = [pre, cur, cur.next];

}

    head.next = cur;

    return pre;

}