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

时间:2012-01-01 07:33:06

标签: c++ algorithm list data-structures

面试问题:

  

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

我的想法:

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

在新列表中,对于每个节点i,将每个列表以sentinel分隔,并使用i的变量点。

空间效率不高。在时间和空间上是O(n ^ 2)。 好主意?

2 个答案:

答案 0 :(得分:1)

我认为你可以从例如Java的 序列化,它识别指针何时指向已经序列化的节点,以便它可以合理有效地序列化(然后反序列化)任意结构。您可以通过http://docs.oracle.com/javase/1.4.2/docs/guide/serialization/index.html上的链接下载的规范说这已经完成,但没有确切说明 - 我怀疑哈希表。

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

答案 1 :(得分:0)

这是一个典型的面试问题。您可以使用Google找到许多答案。这是一个我认为有助于理解的链接。但请阅读评论,主体中有一些错误:Copy a linked list with next and arbit pointer