美文网首页
【迭代】25 -- k个一组翻转链表

【迭代】25 -- k个一组翻转链表

作者: 何几时 | 来源:发表于2021-08-05 10:30 被阅读0次

    思路

    很重要的一点:

    # 每次迭代,tail 是在 head 之前
                prev = tail
                head = tail.next
    # 每次tail会从head的前一个节点开始数数
                for i in range(k):
                    tail = tail.next
                    if not tail:
                        # 说明最后一段节点数量小于k,不需要翻转
                        return hair.next
    

    完整代码

    class Solution:
        def reverseSubList(self, head, tail):
            prev = None
            curr = head
    
            while prev != tail:
                tmp = curr.next 
                curr.next = prev
                #更新
                prev = curr
                curr = tmp
    
    
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            # corner case
            if head is None or head.next is None or k == 1:
                return head
            
            # 创建一个链表头
            hair = ListNode(0)
            hair.next = head
            # 因为最后要返回 hair.next ,所以要新建一个移动的指针prev
            prev = hair
            tail = prev
    
            while head:
                # 每次tail会从head的前一个节点开始数数
                for i in range(k):
                    tail = tail.next
                    if not tail:
                        # 说明最后一段节点数量小于k,不需要翻转
                        return hair.next
                
                # 记录下tail的下一个节点,子链表翻转后需要拼接回来
                aftr = tail.next
                # 辅助函数作用,输入链表头和链表尾,翻转链表
                self.reverseSubList(head, tail)
                head, tail = tail, head
    
                # 拼接子链表
                prev.next = head
                tail.next = aftr
    
                # 更新
                prev = tail
                head = tail.next
            
            return hair.next
    

    相关文章

      网友评论

          本文标题:【迭代】25 -- k个一组翻转链表

          本文链接:https://www.haomeiwen.com/subject/adkmvltx.html