题目
描述
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如:
给出的链表为
1→2→3→4→5→NULL,
m=2,n=4,
返回
1→4→3→2→5→NULL.
数据范围: 链表长度
0<size≤1000,
0<m≤n≤size,链表中每个节点的值满足 ∣val∣≤1000
要求:时间复杂度 O(n) ,空间复杂度 O(n)
进阶:时间复杂度 O(n),空间复杂度 O(1)
思路
分成三个部分,把中间部分截取出来反转,然后再接上。
代码
python版本:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @param m int整型
# @param n int整型
# @return ListNode类
#
class Solution:
def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
# write code here
sg = ListNode(-1)
sg.next = head
#头部
pre = sg
for i in range(m-1):
pre = pre.next
#中部
right_node = pre
for i in range(m-1, n):
right_node = right_node.next
#尾部
left_node = pre.next
cur = right_node.next
pre.next = None
right_node.next = None
self.reverse_listnode(left_node)
#接骨
pre.next = right_node
left_node.next = cur
return sg.next
def reverse_listnode(self, listnode_head: ListNode):
pre = None
cur = listnode_head
while(cur!=None):
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp