class RandNode(object):
def __init__(self,val=None):
self.val = val
self.rand = None
self.next = None
def CopyListWithRandom(head):
if head == None:
return None
map = {}
cur = head
#将复制的节点存到键值对
while cur != None:
map[cur] = RandNode(cur.val)
cur = cur.next
#在重新连接
cur = head
while cur != None:
map[cur].next = None if cur.next==None else map[cur.next]
map[cur].rand = None if cur.rand==None else map[cur.rand]
cur = cur.next
return map[head]
第二种 不用map辅助空间 字典的增删改查都为O(1)
class RandNode(object):
def __init__(self,val=None):
self.val = val
self.rand = None
self.next = None
def CopyListWithRandom(head):
if head == None:
return None
cur = head
while cur.next!= None:
next = cur.next
cur.next = RandNode(cur.val)
cur.next.next = next
cur = next
#先把随机指针设置好
cur = head
while cur != None:
cur.next.rand = None if cur.rand else cur.rand.next
cur = cur.next.next
#再拆开
CopyHead = head.next
cur = head
while cur!=None:
next = cur.next
cur.next = next.next
next.next = None if next.next==None else next.next.next
cur = cur.next
return CopyHead