138. Copy List with Random Pointer
# Definition for singly-linked list with a random pointer.
# class RandomListNode(object):
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution(object):
def copyRandomList(self, head):
"""
:type head: RandomListNode
:rtype: RandomListNode
"""
if head is None:
return head
dummy = RandomListNode(-1)
cur = dummy
curOld = head
mapping = {}
mapping[None] = None
while(curOld):
cur.next = RandomListNode(curOld.label)
mapping[curOld] = cur.next
cur = cur.next
curOld = curOld.next
cur = dummy
curOld = head
while(curOld):
cur.next.random = mapping[curOld.random] # when random is None, traversing linked list won't add none in the dictionary, we need to do it manually
cur = cur.next
curOld = curOld.next
return dummy.next
'''Use dictionary to map old nodes (as key) to new nodes (as value). So that we could traverse old & new list together and know which new list node should be set as random reference.
See 1) 2) 3) 4) 5) in the code comments
To summary, by inserting new node after old node, we could replace the mapping relationship. The core algorithm is :
Last updated