补题 | 给定L、R翻转这个范围内的链表

找到翻转区间的前后节点保存,利用递归实现翻转链表

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值