题目:
解法一:递归
代码:
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
# 递归:核心思想是链表无后指针所以需要利用递归进行回溯,同时交换值,实现反转
if not head:
return
left = right = head
stop = False
def reverse_Recusive(right, m, n):
nonlocal left, stop # python内嵌函数中查找当前变量找不到去上一层找
if n == 1:
return
# 递归移动左右指针到,m,n节点
right = right.next
if m > 1:
left = left.next
reverse_Recusive(right, m-1, n-1)
if left == right or right.next == left:
stop = True
if not stop:
left.val, right.val = right.val, left.val # 交换值
left = left.next # 右指针递归已经回溯了
reverse_Recusive(right, m, n)
return head
思路:
采用递归的回溯模拟指针后移,然后前指针和后指针交换值即可;
解法二:非递归
代码
# 非递归
dummy = ListNode(0)
dummy.next = head
pre, cur = dummy, head
if not head:
return None
while m > 1:
pre = cur
cur = cur.next
m -= 1
n -= 1
newH = pre
tail = cur
while n:
k = cur.next
cur.next = pre
pre = cur
cur = k
n -= 1
if newH:
newH.next = pre
# else:
# dummy.next = pre
tail.next = cur
return dummy.next
思路:
一. 找到反转链表的第m,n个节点的prev和current指针,其中m节点pre指针指的是需要反转部分(新链表)的头,m节点cur指针指的节点是新链表的尾;比如[1,2,3,4,5],m=2,n=4(是位置不是坐标),则1是新链表的头,2是新链表的尾;最终目标链表[1,4,3,2,5]
二.从第m个节点开始,利用两两反转方法移动pre和cur指针;直到prev指向4,cur指向5; 【4->3->2】
三.再让1指向4,2指向5就ok了
法三:
# 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
# 思路:1.表头;
# 2.链表反转需要两个指针,pre,cur;
# 3.反转需要保持cur后的节点为temp;
# 初始化
dummy = ListNode(-1)
dummy.next = head
pre, cur = dummy, head
# 找到m
for j in range(1, m):
pre = cur
cur = cur.next
# 从m到n反转
for i in range(m, n):
tmp = cur.next
cur.next = tmp.next
tmp.next = pre.next
pre.next = tmp
return dummy.next