• 剑指offer python版 复杂链表的复制


    import random
    
    
    class Node(object):
    
        def __init__(self, val):
            self.val = val
            self.next = None
            self.other = None
    
    
    class Solution(object):
    
        @staticmethod
        def clone_nodes(head):
            # 结点复制
            move = head
            while move:
                tmp = Node(move.val)
                tmp.next = move.next
                move.next = tmp
                move = tmp.next
            return head
    
        @staticmethod
        def set_nodes(head):
            # other指针设置
            move = head
            while move:
                m_next = move.next
                if move.other:
                    m_next.other = move.other.next
                move = m_next.next
            return head
    
        @staticmethod
        def reconstruct_nodes(head):
            # 结点拆分
            ret = head.next if head else Node
            move = ret
            while head:
                head = move.next
                if head:
                    move.next = head.next
                    move = move.next
            return ret
    
        @staticmethod
        def clone_link(head):
            # 结果
            h = Solution.clone_nodes(head)
            h = Solution.set_nodes(h)
            ret = Solution.reconstruct_nodes(h)
            return ret
    
        @staticmethod
        def print_nodes(head):
            # 打印结点值,结点other的值,用来比较
            ret = []
            while head:
                tmp = [head.val]
                if head.other:
                    tmp.append(head.other.val)
                ret.append(tmp)
                head = head.next
            print ret
    
        @staticmethod
        def construct_nodes(vals):
            """
            构造一个简单的复杂链表
            :param vals: list
            :return: Nodes
            """
            if not vals:
                return Node
            move = head = Node(vals.pop(0))
            nodes = [None, head]
            for v in vals:
                tmp = Node(v)
                move.next = tmp
                nodes.append(tmp)
                move = move.next
            # print [node.val for node in nodes if node]
            move = head
            while move:
                # 设置other指针为随机结点
                move.other = random.choice(nodes)
                move = move.next
            return head
    
    
    if __name__ == '__main__':
        link = Solution.construct_nodes([1, 2, 3, 4, 5])
        Solution.print_nodes(link)
        test = Solution.clone_link(link)  # 复制
    Solution.print_nodes(test)
  • 相关阅读:
    关于fft后图像的纵轴问题
    matlab 与 modelsim 联调 cic抽取滤波器
    z变换的性质
    转载 iir直接i型和直接ii型滤波器
    第十六篇:初探IO复用
    第十五篇:关于TCP通信程序中数据的传递格式
    第十四篇:回射程序中的异常分析
    第十三篇:并发回射服务器的具体实现及其中僵尸子进程的清理( 下 )
    loj 1031(区间dp+记忆化搜索)
    loj 1150(spfa预处理+二分+最大匹配)
  • 原文地址:https://www.cnblogs.com/xzm123/p/9855209.html
Copyright © 2020-2023  润新知