代码
/*
* 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