使用随机指针复制链表
138. Copy List with Random Pointer Medium
Description
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.
Example
Input:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
Explanation:
Node 1's value is 1, both of its next and random pointer points to Node 2.
Node 2's value is 2, its next pointer points to null and its random pointer points to itself.
- Note:
You must return the copy of the given head as a reference to the cloned list.
题意
给定链表,每个节点不仅包含val值和next指针,还包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回列表的深层副本。
解题思路
用hash表记录老链表和新链表的对应关系。先构造了一个纯next的链表,然后再次循环遍历给random指针赋值,就得到了带random的复杂链表了。
code
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, next, random):
self.val = val
self.next = next
self.random = random
"""
class Solution(object):
def copyRandomList(self, head):
"""
:type head: Node
:rtype: Node
"""
if not head:
return None
nodeDic = dict()
rep = Node(0,None,None)
nodeDic[head] = rep
newHead, pointer = rep, head
while pointer:
node = Node(pointer.val, pointer.next, None)
nodeDic[pointer] = node
newHead.next = node
newHead, pointer = newHead.next, pointer.next
pointer = head
while pointer:
if pointer.random:
nodeDic[pointer].random = nodeDic[pointer.random]
pointer = pointer.next
return rep.next