先举个例子:原链表:m = 2 ,n = 4
我们可以通过三步来实现这个过程
- 从 𝑚+1 到 𝑛 的这些节点将 𝑛𝑒𝑥𝑡 指针指向前一个节点。
- 𝑚 节点的 𝑛𝑒𝑥𝑡 指针指向 𝑛 节点的 𝑛𝑒𝑥𝑡
- 𝑚−1 节点的 𝑛𝑒𝑥𝑡 指针指向 𝑛 节点
有两种特殊情况:
第一种:如果m和n相等,即:指定的区间只有一个节点,这个时候按这个步骤进行的话,是没有问题的
第二种:如果m=1,这时,m-1 节点是不存在的,这样就出现了问题。
为了解决这个问题加上一个头节点即可。
function reverseBetween( head , m , n ) {
// 如果只有一个节点直接返回即可
if(m == n){
return head;
}
// 制造一个前置节点
let dummy = new ListNode(-1)
// 让这个前置节点和链表连接起来
dummy.next = head;
// pre指针
let mPre = dummy
// 指向m的前一个位置
for(let i=0;i<m-1;i++){
mPre = mPre.next;
}
//m位置的副本 因为最后需要让m节点的指针指向n.next
let M = mPre.next;
//一前一后两个指针
let pre = M;
let now = M.next;
for(let i=m+1;i<=n;i++){
let Next = now.next;
now.next=pre;
if(i==n){
// 𝑚 节点的 𝑛𝑒𝑥𝑡 指针指向 𝑛 节点的 𝑛𝑒𝑥𝑡
//𝑚−1 节点的 𝑛𝑒𝑥𝑡 指针指向 𝑛 节点
M.next = Next;
mPre.next = now;
}
// 指针移动
pre=now;
now=Next;
}
// 最后返回的时候去掉伪头节点
return dummy.next;
}