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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的题解
此前做过一道反转链表的题,可做参考:
本题也是差不多的思路,只不过多了几步确定反转起点的步骤。核心的思路可以看上面的这篇博客,这里就不再赘述了。
详解请看下方注释:
/**
* 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
【更新结束】
有关参考
更新:2021年10月23日10:20:00
参考:【算法-LeetCode】206. 反转链表(单链表;生成LeetCode单链表)_赖念安的博客-CSDN博客