#92.反转链表Ⅱ

题目描述:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:1 ≤ m ≤ n ≤ 链表长度。

知识点:
在扫描链表的过程中记录m与n两个节点位置
思路和代码:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        # head只有一个节点或为空时不能反转,直接返回head
        if head == None or head.next == None:
            return head
        # m=1表示反转前n个节点,直接调用reverse(head,n)
        if m == 1:
            head = self.reverse(head, n)
        else:
            i = 1

            m_node = head
            while m_node.next:
                # 找到并记录第m个节点的前一个节点,用于连接后续反转得到的节点
                if i == m - 1:
                    break
                m_node = m_node.next
                i += 1
            m_node.next = self.reverse(m_node.next, n + 1 - m)
        return head
    def reverse(self, head, num):
        # 反转前num个节点
        if head == None or head.next == None or num<=1:
            return head
        # 创建反转后的尾节点,用于连接后续节点
        n_node = ListNode(head.val)
        first_head = n_node
        head = head.next
        i = 2
        while i <= num:
            # 到达了链表尾部
            if head == None:
                break
            #将当前遍历的节点插入新建的链表头部
            first_head = self.insert(first_head, head.val)
            head = head.next
            i += 1
        # 连接后续节点
        n_node.next = head
        return first_head

    def insert(self, head, x):
        # 在头节点插入节点
        temp_node = ListNode(x)
        temp_node.next = head
        return temp_node
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值