题目:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
解析:
这道题跟反转链表1的思路是一样的,无非在这里需要设置一个虚拟的头部节点,方便重新连接的操作
具体代码:
/** * 反转链表从第left个节点到第right个节点的部分 * @param {ListNode} head - 链表头节点 * @param {number} left - 起始位置(从1开始计数) * @param {number} right - 结束位置 * @return {ListNode} - 反转后的链表头节点 */varreverseBetween=function(head,left,right){// 创建虚拟头节点,简化边界情况处理(特别是当left=1时)constdummy=newListNode(0,head)// p0指针将指向要反转部分的前一个节点letp0=dummy// 移动p0到要反转部分的前一个节点// 例如:left=2时,p0需要移动到第1个节点for(leti=0;i<left-1;i++){p0=p0.next}// 准备反转链表的核心指针letpre=null// pre指向已反转部分的头节点letcur=p0.next// cur指向当前要反转的节点(第left个节点)// 反转从left到right的链表部分// 需要反转的节点数量:right-left+1for(leti=0;i<right-left+1;i++){// 保存当前节点的下一个节点consttemp=cur.next// 反转:当前节点指向已反转部分cur.next=pre// 移动pre指针到当前节点(扩展已反转部分)pre=cur// 移动cur指针到下一个待反转节点cur=temp}// 循环结束后:// - pre指向反转后的新头节点(原第right个节点)// - cur指向未反转部分的首节点(原第right+1个节点)// 关键连接步骤1:将反转部分的尾节点连接到剩余链表// p0.next指向原第left个节点(现在是反转部分的尾节点)// 将其next指向cur(未反转部分的首节点)p0.next.next=cur// 关键连接步骤2:将p0连接到反转部分的新头节点// p0是反转部分的前一个节点,现在连接到反转后的新头节点prep0.next=pre// 返回整个链表的头节点returndummy.next};