给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
思路:
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;
}