Leetcode25. K 个一组翻转链表 Python3

Leetcode25. K 个一组翻转链表

这道题很懵,注释也是写给自己看的,免得以后又忘了。如果刚好能帮到你就更好了,由于没时间仔细修改,注释很可能存在不准确的地方,仅供参考,同时欢迎指正!

class Solution:
    def reverse(self, head: ListNode, tail: ListNode):
        # 定义prev,用于记录改变指针的最后一个节点的位置
        prev = None
        # p用来记录准备要改变next属性的节点,也是为了保护head节点可以不动
        p = head
        # prev == tail说明子链表的尾节点已经翻转完毕,即子链表已经翻转完毕,此时的prev已经是尾节点,而p已经到下一个子链表的第一个节点或空节点处了
        while prev != tail:
            # 记录当前要改变的next,否则改变next后就找不到了
            nex = p.next
            # 将当前要改变方向的节点的next指向prev,改变节点指向
            p.next = prev
            # prev移动到当前的节点
            prev = p
            # 将p移动到下一个要翻转的点
            p = nex
        # 由于翻转并没有改变head和tail(用prev也可以),所以当前的head已经是尾节点了,而tail是头结点,所以反过来返回
        return tail, head

    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        # 首先定义原链表头结点dummy
        dummy = ListNode(0)
        # 建立dummy与链表的关系
        dummy.next = head
        # 定义子链表的头节点前一个节点指针pre,初始状态指向dummy
        pre = dummy
		# 当将要翻转的子链表头节点不为空时就一直循环
        while head:
            # 定义子链表尾节点指针tail,每次循环的初始位置与子链表的头结点指针相同
            tail = pre
            # 查看是否需要翻转,并将tail移动到子链表的最后一个节点
            for i in range(k):
                tail = tail.next
                # 如果tail为空,那么说明剩余节点数已经不足k个,说明该子链表不需要翻转,直接返回dummy.next结束程序
                if not tail:
                    return dummy.next
            # 定义nex用于记录下一个子链表的头节点位置,由于当前子链表的tail随后会发生翻转,不记录,后面子链表就无法与原链表连接
            nex = tail.next
            # 翻转子链表,并返回新的头节点和尾节点
            head, tail = self.reverse(head, tail)
            # 将子链表的头与原链表连接
            pre.next = head
            # 将子链表的尾与原链表连接
            tail.next = nex
            # 将pre移动到子链表的尾节点,作为下一次翻转的pre
            pre = tail
            # head也移动到下一次翻转的头节点位置上
            head = tail.next
        # 返回链表
        return dummy.next

代码来自leetcode,加了一些自己理解的注释,方便自己日后复习,也希望能帮助到其他人:
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/k-ge-yi-zu-fan-zhuan-lian-biao-by-leetcode-solutio/
来源:力扣(LeetCode)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值