leetcode92T 翻转指定结点间的链表 以及k个一组翻转链表

解释p.next.next, p.next = cur, pre的正确性代码:

class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        # 找到m到n之间的链表,翻转即可。
        if m == n:
            return head
        # 浅复制指向同一块地址
        p = dummy = ListNode(0)
        dummy.next = head
        # 首先找到翻转的前一个即p
        for _ in range(m - 1):
            p = p.next
        # cur即m位置的链表
        pre, cur = None, p.next
        # 翻转m到n之间的链表
        for _ in range(n - m + 1):
            cur.next, pre, cur = pre, cur, cur.next
        # 先next.next 再next
        p.next.next = cur
        p.next = pre
        # 上面两行等同于下面一行
        # p.next.next, p.next = cur, pre
        return dummy.next

迭代法实现k个结点一组翻转链表

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        l, num = head, 0
        while l:
            num += 1
            l = l.next
        times = num // k
        if not times: return head
        def rever(node):
            pre, cur = None, node
            for _ in range(k):
                cur.next, pre, cur = pre, cur, cur.next
            return pre, cur
        
        prev = res = ListNode(-1)
        prev.next = head
        for time in range(times):
            rev, suf = rever(prev.next)
            prev.next.next = suf
            # 要用tmp保留每次翻转的最后一个值,用于后续翻转的前缀
            tmp = prev.next
            prev.next = rev
            prev = tmp
            
        return res.next
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值