zoukankan      html  css  js  c++  java
  • 剑指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)
  • 相关阅读:
    javascript常用函数封装——运动、cookie、ajax、获取行内样式兼容写法、拖拽
    Git——如何将本地项目提交至远程仓库
    cookie——登录注册极简版
    jsonp实现下拉搜索
    Ajax——从服务器获取各种文件
    机器学习(一)理论
    机器学习(二)数据处理&相似/异性度量
    【汇总】机器学习基础之「统计篇」思维导图
    code备忘
    sentinel备忘
  • 原文地址:https://www.cnblogs.com/xzm123/p/9855209.html
Copyright © 2011-2022 走看看