请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
思路1 直接Python调用
该题的意思是copy一个链表,也就是所谓的深拷贝;而不是创建一个指针指向原有的链表。
因此,在python中可以直接调用函数copy.deepcopy
代码
"""
# Definition for a Node.
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
return copy.deepcopy(head)
结果
思路2 DFS
思路
从头节点head开始拷贝。
设立字典,记录节点是否已经被拷贝;
对每一个节点,先遍历next再遍历random。
代码
"""
# Definition for a Node.
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
def dfs(node,visited):
if not node:
return None
if node in visited: # 已拷贝,则不进行重复拷贝
return visited[node]
copy = Node(node.val, None, None)
visited[node] = copy
copy.next = dfs(node.next, visited)
copy.random = dfs(node.random, visited)
return copy
visited = {}
return dfs(head,visited)
结果
总结
Python自带了deep copy的函数copy.deepcopy