美文网首页
K 个一组翻转链表

K 个一组翻转链表

作者: dalewong | 来源:发表于2020-07-28 07:42 被阅读0次

    从最基础的翻转链表开始:

    def reverse_linklist(l):
        prev = None
        head = l.head
        while head:
            tmp = head.next
            head.next = prev
            prev = head
            head = tmp
    

    好,我们开始计算K个一组翻转列表:

    1. k个一组的数组翻转
    2. 组个组的之间的指针的指向修改
    # coding: utf-8
    
    
    class LinkListNode(object):
    
        def __init__(self, value):
            self.value = value
            self.next = None
    
    
    def k_reverse_list(head, k):
        # 首先需要构造pre指针指向组
        pre = LinkListNode(None)
        pre.next = head
        # 需要一个固定的指针指向联表的头部, 最后好返回整个链表
        hair = pre
        while head:
            tail = head
            for i in range(k):
                # k个分组
                tail = tail.next
                if not tail:
                    break
            # 设置lnext保存下一个k组
            lnext = tail.next
            # 翻转组内的数据
            rhead, rtail = reverse_group(head, tail)
            # 使得pre指针指向翻转后的组, 并且tail指向下一个组的开始节点
            # pre指针移动到tail, head指针移动到tail.next
            pre.next = rhead
            rtail.next = lnext
            pre = tail
            head = lnext
        return hair.next
    
    
    def reverse_group(head, tail):
        # 翻转之后tail.next为pre
        # [A --> B --> C] --> [D --> E]
        # [C --> B --> A] --> [E --> D]
        pre = tail.next
        p = head
        while pre != p:
            t_next = p.next
            p.next = pre
            pre = p
            p = t_next
        return tail, head
    

    相关文章

      网友评论

          本文标题:K 个一组翻转链表

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