• 92反转链表II


    # Definition for singly-linked list.
    # 这道题还是有点复杂的,但是是有套路的,套用反转链表的想法
    class ListNode:
    def __init__(self, val=0, next=None):
    self.val = val
    self.next = next

    class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
    # 首先定义一个前置根节点,这样做是用来当反转链表的开头为1的时候,我们也能够反转它。
    node_None = ListNode(0)
    # 组成新的链表。
    node_None.next = head
    # 定义变量用来遍历链表。
    pre = node_None
    # 遍历,找到我们需要反转链表段的开头。
    for i in range(left - 1):
    pre = pre.next
    # 此时pre在需要反转的链表左端的前一个节点。
    # 因为我们前置了一个根节点,所以一定会有这个节点。
    # 找到第一个需要反转的节点。
    node = pre.next
    # 然后定义一个变量,用来反转链表。
    node1 = pre
    for i in range(right - left + 1):
    # 这里是有顺序的,不能够把顺序写乱。
    # node的next指向前面,node1 向下一个,node 向下一个,这样我们就反转了一个节点,
    # 然后接着遍历。
    node.next,node1,node, = node1,node,node.next
    # 当循环结束的时候, node 为 反转链表右端的下一个节点,也肯能为空。
    # node1位反转链表右端那个节点。
    # 因此我们需要将整个反转链表段和之前的链表重新连接,然后组成反转之后的链表。
    pre.next.next = node
    pre.next = node1
    # 注意,这里我们需要返回node_None的下一个节点,
    # 不能返回head节点,因为有可能head节点已经被反转了。
    return node_None.next





    a = ListNode(1)
    b = ListNode(2)
    c = ListNode(3)
    d = ListNode(4)
    e = ListNode(5)
    f = ListNode(6)
    a.next = b
    b.next = c
    c.next = d
    d.next = e
    e.next = f
    # a.next = b
    # a.next = b


    A = Solution()
    print(A.reverseBetween(a,2,4))
  • 相关阅读:
    [USACO18DEC]Fine Dining
    [USACO18DEC]Cowpatibility(容斥 or bitset优化暴力)
    [P2387魔法森林
    P4172 [WC2006]水管局长
    P2486 [SDOI2011]染色
    P3950部落冲突
    P4332三叉神经树
    莫比乌斯反演习题总结
    牛客 斐波那契数列问题的递归和动态规划3
    牛客 统计和生成所有不同的二叉树
  • 原文地址:https://www.cnblogs.com/cong12586/p/14554098.html
Copyright © 2020-2023  润新知