给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
提示:
你必须返回给定头的拷贝作为对克隆列表的引用。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
emmm,第一眼看过去,这不是133吗。
本题是133变种题,区别在于133是图有邻居,138是链表有随机指针。
开一个哈希表mapping,key是老结点,val是新节点,
然后把 老结点(key)的next和random对应的新节点(mapping[key.next] 和mapping[key.random]) 分别赋给新节点(val)的next (val.next)和random (val.random)。
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, next, random):
self.val = val
self.next = next
self.random = random
"""
class Solution(object):
def copyRandomList(self, head):
"""
:type head: Node
:rtype: Node
"""
#133变种题, 图换成链表
mapping = dict()
p = head
while p:
mapping[p] = Node(p.val, None, None)
p = p.next
for key, val in mapping.items(): #key是老结点, val是新节点
if key.next:
val.next = mapping[key.next]
if key.random and key.random in mapping:
val.random = mapping[key.random]
return mapping[head] if head else head