python - 使用随机指针复制列表。第二个while循环在这里做什么?
问题描述
"""
# Definition for a Node.
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
oldToCopy = { None : None}
curr = head
while curr:
copy = Node(curr.val)
oldToCopy[curr] = copy
curr = curr.next
curr = head
while curr:
copy = oldToCopy[curr]
copy.next = oldToCopy[curr.next]
copy.random = oldToCopy[curr.random]
curr = curr.next
return oldToCopy[head]
此代码正在制作链接列表的深层副本。在第一个 while 循环中,我们复制每个节点值并将其放入 hashmap 中。在第二个 while 循环中,我们设置copy
为从 hashmap 中获得的值?
copy
当我这样做时,从 hashmap中分配copy.next
和到值如何返回答案。copy.random
oldToCopy[head]
对这段代码在做什么感到困惑。
解决方案
这是一个链表,所以每个节点都有一个指向下一个节点的指针(在这种情况下还有一个指向随机节点的指针)。
第一个循环构造oldToCopy
,它是原始节点到节点副本的映射。这意味着当您在其中查找某些内容时,oldToCopy
您正在使用原始节点作为键来检索该节点的副本。
然后第二个循环再次遍历原始列表并:
copy
被分配为指向curr
在第一个循环中创建的节点的副本(这只是为了方便避免oldToCopy[curr]
反复使用)。copy.next
被赋值为指向所指向的节点的副本curr.next
。copy.random
类似地分配。
为每个副本设置next
和random
指针是在两个循环中完成的,因为当您复制节点时,x
您还没有指向的节点的副本x.next
- 您将在下一次迭代中制作该副本。
推荐阅读
- python - Flask 布局模板表单如何获取发布/获取请求。路线布局?
- android - fontFamily "Roboto_medium" 不是系统字体,没有通过 Font.loadAsync 加载,如何解决?
- java - 如何仅为整数创建自定义异常
- node.js - 尝试读取 fullchain.pem 时出现 EPERM 错误
- scala - Spark 解析具有多种类型的 XML
- javascript - 如何删除图像并重新使用它
- spring-boot - 基于用户在 Angular 应用程序中的活动刷新 JWT 令牌,使用 Spring boot for API
- android - 装有 Android 10 的 Android 盒子上的设备所有者无法正常工作
- jestjs - Expo & Jest:Jest 遇到了意外的令牌
- tfx - TFTransform ValueError:“所有示例工件不存在拆分”