题目
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.
基本思路
链表的拷贝其实可以看做两个步骤,一个是节点数据的拷贝,另一个是节点关系的拷贝。我们也可以先把所有的节点进行拷贝,并存入字典中。然后遍历链表并拷贝两个指针。因为任意指针可能指向空指针,所以在字典中添加一个空指针项。
实现代码
# 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 not head:
return None
# 使用一个字典类型进行拷贝
res = dict()
# 数值拷贝
node = head
while node:
res[node] = RandomListNode(node.label)
node = node.next
# 设置尾结点
res[None] = None
# 进行两个指针的拷贝
node = head
while node:
res[node].next = res[node.next]
res[node].random = res[node.random]
node = node.next
return res[head]