找到翻转区间的前后节点保存,利用递归实现翻转链表
2023-11-4 更新代码
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
def reverse_list(head):
if head is None or head.next is None:
return head
new_head = reverse_list(head.next)
head.next.next = head
head.next = None
return new_head
dummy_head = ListNode(0)
dummy_head.next = head
leftnode, rightnode = dummy_head, dummy_head
for i in range(left-1):
leftnode = leftnode.next
for i in range(right):
rightnode = rightnode.next
print(leftnode.val)
print(rightnode.val)
# cut right
keep_right_node = rightnode.next
rightnode.next = None
new_tail = leftnode.next
re_head = reverse_list(leftnode.next)
leftnode.next = re_head
new_tail.next = keep_right_node
return dummy_head.next
# -*- encoding: utf-8 -*-
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def reverseBetween(head: ListNode, m: int, n: int) -> ListNode:
def re_linkedlist(head):
if head == None or head.next == None:
return head
new_head = re_linkedlist(head.next)
head.next.next = head
head.next = None
return new_head
if n == m:
return head
Head = head
for i in range(n - 1):
Head = Head.next
left_node = Head.next
Head.next = None
prev_node = None
Head = head
for i in range(m - 1):
prev_node = Head
Head = Head.next
if prev_node != None:
re_head = re_linkedlist(prev_node.next)
prev_node.next = re_head
prev_node = head
else:
re_head = re_linkedlist(head)
prev_node = re_head
while re_head.next != None:
re_head = re_head.next
re_head.next = left_node
return prev_node
def print_node(Head):
while Head != None:
print(Head.val, end=" ")
Head = Head.next
print("")
if __name__ == '__main__':
pre_node = None
Head = None
data = [3,1,3,4,1,4,-1]
for i in range(len(data)):
now_node = ListNode(data[i])
if pre_node is not None:
pre_node.next = now_node
else:
Head = now_node
pre_node = now_node
print_node(Head)
new_head = reverseBetween(Head, 3, 7)
print_node(new_head)