92.反转链表2 
代码实现
方案一
实现思路
方案一先找到反转区间的前后边界,再完成区间反转:
- 创建 dummy 节点指向
head,让left = 1时也能找到区间前一个节点。 - 让
leftNode从 dummy 出发,移动left - 1次,定位到反转区间前一个节点。 - 让
rightNode从 dummy 出发,移动right次,定位到反转区间最后一个节点。 - 记录
rightNode.next,它是反转区间后面的第一个节点,并将它作为prev的初始值。 - 从
leftNode.next开始反转固定的right - left + 1个节点。反转结束后,prev指向新的区间头,原来的区间头已经成为新的区间尾,并自动连接到区间后继节点。 - 将
leftNode.next连接到prev,完成整个链表的连接。
例如链表为 1 → 2 → 3 → 4 → 5,left = 2,right = 4:
代码实现
方案二
实现思路
方案二不提前寻找 rightNode,只定位区间前一个节点,然后根据区间长度直接反转:
- 创建 dummy 节点指向
head,统一处理反转头节点的情况。 - 让
beforeLeft从 dummy 出发,移动到第left - 1个位置,找到反转区间前一个节点。 - 保存反转区间头
leftNode,并使用prev、cur反转right - left + 1个节点。 - 反转结束后,
prev是新的区间头,cur是区间后继节点,原来的leftNode是新的区间尾。 - 将
beforeLeft.next指向prev,将leftNode.next指向cur,把反转区间接回原链表。
代码实现
复杂度分析
- 时间复杂度:
O(n),需要遍历到反转区间,并反转区间内的节点。 - 空间复杂度:
O(1),只使用了常数个指针。
边界情况
head为空时,直接返回空链表。left === right时,区间只有一个节点,链表不变。left === 1时,dummy 节点可以代替区间前一个节点,避免单独处理头节点。right等于链表长度时,区间后继节点为null,反转后的区间尾连接到null。


