题目描述
这是 LeetCode 上的 92. 反转链表 II ,难度为 中等。
Tag : 「链表」
给你单链表的头指针 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] 复制代码
提示:
- 链表中节点数目为 n
- 1 <= n <= 500
- -500 <= Node.val <= 500
- 1 <= left <= right <= n
朴素解法
为了减少边界判断,我们可以建立一个虚拟头结点 dummy,使其指向 head,最终返回 dummy.next。
这种「哨兵」技巧能应用在所有的「链表」题目。
黄色部分的节点代表需要「翻转」的部分:
网络异常,图片无法展示
|
之后就是常规的模拟,步骤我写在示意图里啦 ~
网络异常,图片无法展示
|
代码:
class Solution { public ListNode reverseBetween(ListNode head, int l, int r) { ListNode dummy = new ListNode(0); dummy.next = head; r -= l; ListNode hh = dummy; while (l-- > 1) hh = hh.next; ListNode a = hh.next, b = a.next; while (r-- > 0) { ListNode tmp = b.next; b.next = a; a = b; b = tmp; } hh.next.next = b; hh.next = a; return dummy.next; } } 复制代码
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(1)O(1)O(1)
最后
这是我们「刷穿 LeetCode」系列文章的第 No.92
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。