给你单链表的头指针 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
进阶: 你可以使用一趟扫描完成反转吗?
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
if left == right:
return head
head = first_start = ListNode(next=head)
counter = 0
while head:
if counter < left - 1:
head = head.next
elif counter == left - 1:
first_end = head
head = head.next
elif counter == left:
second_start = head
pre = head
head = head.next
elif counter < right:
tmp = head.next
head.next = pre
pre = head
head = tmp
elif counter == right:
second_end = head
third_start = head.next
head.next = pre
pre = None
# 拼接
first_end.next = second_end
second_start.next = third_start
return first_start.next
else:
break
counter += 1
时间复杂度 O(n):一个大循环最多遍历链表完整一次,计O(n)。共O(n)。
空间复杂度 O(1):常量。共 O(1)。
还是官解写的简洁
python
class Solution:
def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
# 设置 dummyNode 是这一类问题的一般做法
dummy_node = ListNode(-1)
dummy_node.next = head
pre = dummy_node
for _ in range(left - 1):
pre = pre.next
cur = pre.next
for _ in range(right - left):
next = cur.next
cur.next = next.next
next.next = pre.next
pre.next = next
return dummy_node.next
# 作者:力扣官方题解
# 链接:https://leetcode.cn/problems/reverse-linked-list-ii/solutions/634701/fan-zhuan-lian-biao-ii-by-leetcode-solut-teyq/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。