题目:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:
输入: {"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1} 解释: 节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。 节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
思路:
1.使用hashmap,分成两部分。遍历原链表,不对random做任何处理,将生成的新的节点存入hashmap中。再次遍历原链表,只对其random部分进行链接,从hashmap中获取新链表的节点
2.创建新链表,将新链表链接在旧表的后面,a1b1a2b2a3b3……anbn这种形式,a为旧表,b为新表,第二次从头遍历新表,访问旧表的random,其random的下一个,即为当前节点的random
思路1
def copyRandomList(self, head: 'Node') -> 'Node':
dic = {}
if not head:
return None
p = head.next
h = Node(head.val,None,None)
q = h
dic[head.val] = h
while p:
q.next = Node(p.val,None,None)
q = q.next
dic[p.val] = q
p = p.next
p = head
q = h
while p:
if p.random:
q.random = dic[p.random.val]
q = q.next
p = p.next
return h
思路2
def copyRandomList(self, head: 'Node') -> 'Node':
if not head:
return None
p = head
while p: #将新链表节点复制到每个旧链表节点的后面
q = Node(p.val,p.next,None)
p.next = q
p = q.next
p = head
while p: #处理random
if p.random:
p.next.random = p.random.next
p = p.next.next
h = head.next
q = h
p = head
while p: #拆分两个list
p.next = q.next
p = p.next
if not p:
break
q.next = p.next
q = q.next
return h