题目描述:
解法一:迭代
class Solution:
# 迭代写法
def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
# 添加一个头部节点用来表头
res = ListNode(0)
res.next = head
# 前序节点
pre = res
# 当前节点
cur = head
# 找到开始反转的节点
for i in range(0,m-1):
pre = cur
cur = cur.next
# 进行节点的反转
for i in range(m-1,n-1):
tmp = cur.next
cur.next = tmp.next
tmp.next = pre.next
pre.next = tmp
return res.next
解法二:递归
递归的思路是从前往后把每一个节点断开并记录,因此在空间复杂度上最差情况为)(n),而每断开一个节点m和n的位置就往前进一位。在m=1的时候,我们只需要反转前n个节点就可以了。在n=1的时候,我们就可以开始讲节点往前反转。
class Solution:
# 递归写法
def __init__(self) -> None:
self.tmp = None
def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
if m == 1:
return self.resever(head,n)
newHead = self.reverseBetween(head.next,m-1,n-1)
head.next = newHead
return head
def resever(self,head,n):
if n == 1:
self.tmp = head.next
return head
newHead = self.resever(head.next,n-1)
head.next.next = head
head.next = self.tmp
return newHead