反转链表II
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置right
的链表节点,返回 反转后的链表 。
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
|
方法:分解后拼接
算法思路:
- 设置哑节点
dummyNode
,记录开始位置。
- 设置
pre
节点,位移到需反转链表前一位,设置节点leftNode = pre.next
后,执行pre.next = null
断开链接。
- 设置
rightNode = pre
,位移至需反转链表末位,记录cur = rightNode.next
,执行rightNode.next = null
断开链接。
- 编写反转链表代码,反转
leftNode
。
pre.next = rightNode
与leftNode.next = cur
链接三段链表。
代码实现:
class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { ListNode dummyNode = new ListNode(-1); dummyNode.next = head; ListNode pre = dummyNode;
for(int i = 0; i < left - 1; i++){ pre = pre.next; } ListNode leftNode = pre.next; ListNode rightNode = pre; for(int i = 0; i < right - left + 1; i++){ rightNode = rightNode.next; } pre.next = null; ListNode cur = rightNode.next; rightNode.next = null;
reverseListNode(leftNode); pre.next = rightNode; leftNode.next = cur;
return dummyNode.next; }
public void reverseListNode(ListNode head){ ListNode pre = new ListNode(-1); ListNode cur = head; while(cur != null){ ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } } }
|
复杂度分析:
- 时间复杂度:O(n),其中n是链表总节点数。最坏情况下,需要遍历整个链表。
- 空间复杂度:O(1)。只使用到常数个变量。
参考:
LeetCode官方题解 - 92.反转链表II