算法:深拷贝链表,其中链表有个随机指向的指针Copy List with Random Pointer

题目

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.

The Linked List is represented in the input/output as a list of n nodes. Each node is represented as a pair of [val, random_index] where:

  • val: an integer representing Node.val
  • random_index: the index of the node (range from 0 to n-1) where random pointer points to, or null if it does not point to any node.

Example 1:
在这里插入图片描述

Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]

Example 2:
在这里插入图片描述

Input: head = [[1,1],[2,1]]
Output: [[1,1],[2,1]]

Example 3:
在这里插入图片描述

Input: head = [[3,null],[3,0],[3,null]]
Output: [[3,null],[3,0],[3,null]]

Example 4:

Input: head = []
Output: []

Explanation: Given linked list is empty (null pointer), so return null.

Constraints:

  • -10000 <= Node.val <= 10000
  • Node.random is null or pointing to a node in the linked list.
  • The number of nodes will not exceed 1000.

思路分析

next,random都需要指向对象,那么就需要一个字典,key为对象,value为深拷贝的新对象。两次循环即可:

  1. 第一次循环组装字典,
  2. 第二次循环设置next,random。

返回结果为dict[head]

解法一:手动复制链表到字典里面

  def copyRandomList(self, head: 'Node') -> 'Node':
       dict = {}
       m = n = head
       while m:
           dict[m] = Node(m.val)
           m = m.next
       while n:
           dict[n].next = dict.get(n.next)
           dict[n].random = dict.get(n.random)
           n = n.next

       return dict.get(head)

解法二:用系统方法先深拷贝整个链表

import collections
def copyRandomListWithOneRound(self, head: 'Node') -> 'Node':
    dic = collections.defaultdict(lambda: Node(0))
    dic[None] = None
    n = head
    while n:
        dic[n].val = n.val
        dic[n].next = dic[n.next]
        dic[n].random = dic[n.random]
        n = n.next

    return dic[head]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值