面试问题:
在每个节点中随机链接复制链表,每个节点都有一个随机变量 指向列表中的另一个节点。
我的想法:
迭代列表,通过变量复制每个节点及其指向的节点,并在末尾添加一个标记,然后为每个节点执行相同的操作。
在新列表中,对于每个节点i,将每个列表以sentinel分隔,并使用i的变量点。
空间效率不高。在时间和空间上是O(n ^ 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