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)