给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:
输入:
{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …":"1","next":{"id”:“2”,“next”:null,“random”:{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"2"}̲,"val":2},"rand…ref”:“2”},“val”:1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
思路
先在每个节点后创建一个该节点的复制,再将复制节点的random指向原节点的random指向节点的复制节点,最后将链表分成两个
例如
N1->N2->N3
N1.random=N3
先在每个节点N在后创建一个复制节点M
N1->M1->N2->M2->N3->M3
对于复制节点M1
M1.random=N1.random.next (即M1.random=M3)
最后将链表分解为两个链表即
N1->N2->N3
N1.random=N3
和
M1->M2->M3
M1.random=M3
返回M1即可
代码
def copyRandomList(self, head: 'Node') -> 'Node':
if head == None:return None
l1=head
while l1!=None:
l2=Node(l1.val,None,None)#在每个节点后创建一个该节点的复制
l2.next=l1.next
l1.next=l2
l1=l1.next.next
N=head.next
l1=head
while l1!=None:
if l1.random!=None:
l1.next.random=l1.random.next#设置复制节点的random
l1=l1.next.next
l1=head
while l1!=None:#将链表分成两个
l2=l1.next
l1.next=l2.next
if l2.next!=None:l2.next=l2.next.next
l1=l1.next
return N