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。

posted @ 2017-02-20 10:18  lettuan  阅读(161)  评论(0编辑  收藏  举报