• 剑指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)
  • 相关阅读:
    转:IOCP在网络应用中常见错误分析
    Ext.Button的禁用
    Excel连接字符串
    从表单为实体对象赋值
    根据指定类型创建数组
    Ext.GridPanel数据显示不正确
    vue 记事本
    杂谈(一)
    推荐《程序设计的 Top 10 做与不做》和《关于编程,鲜为人知的真相》
    (转)黄鸣博客:警惕29岁现象
  • 原文地址:https://www.cnblogs.com/xzm123/p/9855209.html
Copyright © 2020-2023  润新知