LeetCode-92.反转部分链表
题目描述
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left
<= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例:
1 | 输入:head = [1,2,3,4,5], left = 2, right = 4 |
1 | 输入:head = [5], left = 1, right = 1 |
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
题解
整体思路:
给链表添加一个空表头,防止链表从
head
开始反转,head
变化后返回值不确定性。增加空表头后,返回空表头的next
指向的节点即可;初始化两个指针,
pre
和cur
,分别表示待反转区域的第一个节点left
的前一个节点和待反转区间的第一个节点遍历查找待反转区间的第一个节点,确定
pre
和cur
反转
left
和right
之间的节点:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。其中:
cur
:指向待反转区域的第一个节点left
,每次遍历都会变化;pre
:永远指向待反转区域的第一个节点left
的前一个节点,在循环过程中不变。
链表结构:
1 | class ListNode { |
解法:
1 | func reverseBetween(_ head: ListNode?, _ left: Int, _ right: Int) -> ListNode? { |
复杂度分析:
时间复杂度:O(N)
,其中N
是链表总节点数。最多只遍历了链表一次,就完成了反转。
空间复杂度:O(1)
。只使用到常数个变量。