C++ 在每个节点中复制带有随机链接的链表,每个节点都有一个变量,;它随机指向列表中的另一个节点

C++ 在每个节点中复制带有随机链接的链表,每个节点都有一个变量,;它随机指向列表中的另一个节点,c++,algorithm,list,data-structures,C++,Algorithm,List,Data Structures,面试问题: 用随机链接复制链表中的每个节点,每个节点都有一个变量,该变量是随机的 指向列表中的另一个节点 我的想法: 迭代列表,通过其变量复制每个节点及其指向的节点,并在末尾添加一个哨兵,然后对每个节点执行相同的操作 在新列表中,对于每个节点i,分离以sentinel结尾的每个列表,并使用i的变量指向它 它在空间上没有效率。它在时间和空间上都是O(n^2)。 更好的主意 我认为你可以从Java等方面借鉴一些想法 序列化,它识别指针何时指向已序列化的节点,因此可以合理有效地序列化(然后反序列化)任

面试问题:

用随机链接复制链表中的每个节点,每个节点都有一个变量,该变量是随机的 指向列表中的另一个节点

我的想法:

迭代列表,通过其变量复制每个节点及其指向的节点,并在末尾添加一个哨兵,然后对每个节点执行相同的操作

在新列表中,对于每个节点i,分离以sentinel结尾的每个列表,并使用i的变量指向它

它在空间上没有效率。它在时间和空间上都是O(n^2)。
更好的主意

我认为你可以从Java等方面借鉴一些想法 序列化,它识别指针何时指向已序列化的节点,因此可以合理有效地序列化(然后反序列化)任意结构。该规范可以通过上的链接下载,它说这已经完成了,但没有具体说明如何完成——我怀疑是哈希表


我认为复制很像这样——你甚至不需要知道一些指针组成了一个链表。您可以使用深度优先搜索遍历由节点及其指针组成的图,将每个节点的位置以及复制的节点的值放入哈希表中。如果节点已经存在,则无需执行任何操作,只需使复制的节点中的指针指向哈希表给定的节点副本即可。如果节点尚未存在,则创建副本,将节点放入哈希表中,并将副本地址作为其值,然后递归地将节点中的信息及其指针复制到新创建的副本中。

这是一个典型的面试问题。你可以通过谷歌找到很多答案。我认为这是一个有利于理解的链接。但也请阅读评论,正文中有一些错误: