Leetcode 138. Copy List with random pointer
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
思路:deep copy的意思就是克隆。扫两遍原来的list,第一遍copy node和next。然后再扫第二遍,这是如果pointer.random非空,我们就可以在copy中找到相应的newHead.random = nodeDict[pointer.random]。
1 # Definition for singly-linked list with a random pointer. 2 # class RandomListNode(object): 3 # def __init__(self, x): 4 # self.label = x 5 # self.next = None 6 # self.random = None 7 8 class Solution(object): 9 def copyRandomList(self, head): 10 """ 11 :type head: RandomListNode 12 :rtype: RandomListNode 13 """ 14 nodeDict = {} 15 dummy = RandomListNode(0) 16 newHead, pointer = dummy, head 17 while pointer: 18 Node = RandomListNode(pointer.label) 19 newHead.next = nodeDict[pointer] = Node 20 pointer, newHead = pointer.next, newHead.next 21 pointer, newHead = head, dummy.next 22 while pointer: 23 if pointer.random: 24 newHead.random = nodeDict[pointer.random] 25 newHead, pointer = newHead.next, pointer.next 26 return dummy.next 27
思路二:来自bittiger。只扫一遍。在每个节点检查是不是 pointer, pointer.next, pointer.random已经在nodeDict里面了,如果不在的话,先把需要的节点添加到nodeDict中。
1 # Definition for singly-linked list with a random pointer. 2 # class RandomListNode(object): 3 # def __init__(self, x): 4 # self.label = x 5 # self.next = None 6 # self.random = None 7 8 class Solution(object): 9 def copyRandomList(self, head): 10 """ 11 :type head: RandomListNode 12 :rtype: RandomListNode 13 """ 14 if not head: 15 return head 16 nodeDict = {} 17 pointer = head 18 19 while pointer: 20 if pointer not in nodeDict: 21 node = RandomListNode(pointer.label) 22 nodeDict[pointer] = node 23 24 if pointer.next and pointer.next not in nodeDict: 25 nextnode = RandomListNode(pointer.next.label) 26 nodeDict[pointer.next] = nextnode 27 28 if pointer.random and pointer.random not in nodeDict: 29 randomnode = RandomListNode(pointer.random.label) 30 nodeDict[pointer.random] = randomnode 31 32 if pointer.next: 33 nodeDict[pointer].next = nodeDict[pointer.next] 34 if pointer.random: 35 nodeDict[pointer].random = nodeDict[pointer.random] 36 37 pointer = pointer.next 38 39 return nodeDict[head] 40 41
思路:在每一个node后面都接上一个自己的copy。可以避免使用Hash table。