python中的copy,deepcoy
如果没有random指针,只要依次遍历原链表,每次创建一个新节点等于原链表节点,然后依次连接新节点即可完成deepcopy
由于random指针,复制新节点时,random指针随机指向任意的原链表节点,而如果该原节点还没有被拷贝,新链表就会指向原链表,使deepcopy失败
思路:遍历两次,第一次遍历复制所有节点,同时创建一个哈希表,key为原结点,value为复制的新节点
第二次遍历来调整next指针,使用哈希表中的value替换random指向的原节点
注意:1.在dict中添加None的键,不然会报错
2.第一次遍历复制节点时不能new=head,这样new的指针还会指向原链表,应该创建val=head.val的新节点
class Solution(object):
def copyRandomList(self, head):
#检查是否为空链表#
if head is None:return head
hash=dict()
dummy=Node(0,next=None)
pre=dummy
p=head
#第一次遍历,复制val并确定next指针,同时哈希表储存原节点与对应新节点#
while p:
new=Node(p.val)
hash[p]=new
pre.next=new
pre=new
p=p.next
#哈希表中添加None的键,不然会报错#
hash[None]=None
newhead=dummy.next
p=head
#第二次遍历,新链表的random指针指向哈希表中对应的新节点#
while p:
newhead.random=hash[p.random]
newhead=newhead.next
p=p.next
return dummy.next