leetcode91翻转链表2。python 代码+思路

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

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

示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

"""


'''
思考:
4个关键点:
1逆置前头节点的前驱(之后要指向逆置后的头节点)
2逆置前的头节点/逆置后尾节点(之后要指向逆置前的尾节点的后继)
3逆置前的尾节点/逆置后头节点(之后要指向逆置前的头节点的前驱)
4逆置前尾节点的后继(之后逆置后的尾节点要指向该节点)

首先head已知,就是2
1就是head向前移动m-1的位置的点
逆置n-m+1个节点

逆置结束之后,将逆置前头节点前驱指向逆置后头节点
将逆置前头节点指向逆置前尾结点后继

即前驱仍然是前驱,后继还是后继
'''


# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        dummy = ListNode(-1)
        dummy.next = head
        if m == 1:
            before_head = head
            new_head = None
            for i in range(n - m + 1):
                temp = head.next
                head.next = new_head
                new_head = head
                head = temp  # 结束循环此时head为点4
                before_head.next = head
            return new_head

        else:
            # 最开始head是整个链表的head

            pre_head = None
            for i in range(m - 1):
                # 循环的最后一次记录下逆序前的头节点前驱,即点1
                pre_head = head
                # 往后移动,找逆序前的头节点
                head = head.next
            # 点2,记录逆置前的头节点
            before_head = head

            # 开始逆序
            new_head = None
            for i in range(n - m + 1):
                temp = head.next
                head.next = new_head
                new_head = head
                head = temp  # 结束循环此时head为点4
            # 点2指向点4
            before_head.next = head
            # 点1指向点3
            pre_head.next = new_head

        return dummy.next


l1 = ListNode(1)
l1.next = ListNode(2)
l1.next.next = ListNode(3)
l1.next.next.next = ListNode(4)
l1.next.next.next.next = ListNode(5)
l2 = Solution().reverseBetween(l1, 1, 4)
print(l2)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值