【算法-LeetCode】92. 反转链表 II(链表;指针)

92. 反转链表 II - 力扣(LeetCode)

文章更新:2021年10月23日10:19:13

问题描述及示例

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]

提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解

此前做过一道反转链表的题,可做参考:

参考:【算法-LeetCode】206. 反转链表(单链表;生成LeetCode单链表)_赖念安的博客-CSDN博客

本题也是差不多的思路,只不过多了几步确定反转起点的步骤。核心的思路可以看上面的这篇博客,这里就不再赘述了。

详解请看下方注释:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} left
 * @param {number} right
 * @return {ListNode}
 */
var reverseBetween = function(head, left, right) {
  // 创建一个辅助头结点,注意,本题中因为涉及到要预先确定反转的起点,所以最好创建一个辅助头
  // 结点以方便后续操作,否则就要额外写一些判断逻辑来针对某些特殊情况(比如left为1)
  let dummy = new ListNode(0, head);
  // p指针前期用于确定反转的起点,后面用于指示当前处理节点
  let p = dummy;
  // q指针是指示下一个待处理节点
  let q = null;
  // rear用于指示反转部分的链表的尾部
  let rear = null;
  // 在确定反转起点时,steps用于指示指针需要走多少步
  let steps = left - 1;
  // 开始确定反转的起点,注意,这里是寻找到了起点的前一个节点
  while(steps > 0) {
    p = p.next;
    steps--;
  }
  // 用head指针标识反转起点的前一个节点
  head = p;
  // 此时p指针才真正指向反转的起点
  p = p.next;
  // rear用于反转部分的尾部
  rear = p;
  // 初始化反转部分的前置部分
  head.next = null;
  // 开始反转操作,left标识的位置是当前处理节点的位置,right是结束位置
  while(left <= right) {
    // 下面的反转操作就和普通的反转链表操作一致了
    q = p.next;
    p.next = head.next;
    head.next = p;
    p = q;
    left++;
  }
  // 将原先的链表后半部分链接到反转后链表的后面
  rear.next = q;
  // 返回反转后的链表头节点,注意,不是辅助头结点
  return dummy.next;
};


提交记录
44 / 44 个通过测试用例
状态:通过
执行用时:64 ms, 在所有 JavaScript 提交中击败了88.70%的用户
内存消耗:37.7 MB, 在所有 JavaScript 提交中击败了88.53%的用户
时间:2021/10/23 10:22

总的来说,链表题还是要灵活地运用指针。

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年10月23日10:23:26

参考:反转链表 II - 反转链表 II - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年10月23日10:20:00
参考:【算法-LeetCode】206. 反转链表(单链表;生成LeetCode单链表)_赖念安的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值