克隆单链表

时间:2012-07-29 09:34:14

标签: java data-structures linked-list

我有一个单独的链表。除了普通的“Next”指针外,每个节点还有一个指针(随机ptr)指向列表的某个随机节点。如何创建这样一个列表的克隆? (小于O(n ^ 2))。

使用Java的任何建议或解决方案?

4 个答案:

答案 0 :(得分:1)

您可以按顺序克隆所有节点,并在第一次传递期间构建将每个原始节点与其克隆相关联的标识映射。

然后执行第二次传递,并为每个原始节点获取其关联的随机节点,然后从映射中获取相应的克隆,并将原始节点的克隆与随机节点的克隆相关联。整个过程仍然是O(n)。

答案 1 :(得分:1)

可以有两种方式:

1)散列所有节点的地址并存储随机指针指向的节点。 (总体复杂性为O(n)。)

2)另一个O(n)解决方案将如链接所示(不使用任何额外空间):http://www.geeksforgeeks.org/archives/1155

答案 2 :(得分:1)

这是O(n)时间和O(1)空间的答案。 (具有哈希表或关联映射的解决方案需要O(n)空间)。 shg的链接也是O(n)时间和O(1)空间的解决方案。

  • 遍历列表以计算单元格数n。
  • 创建一个大小为n的数组t,每个单元格由两个指针ab组成。在算法结束时,这将是副本。但现在不是。
  • 遍历原始列表。对于原始列表的k th 单元格c
    • t[k].a成为指向c
    • 的指针
    • c.next成为t[k]的指针(原始列表暂时被销毁,我们稍后会恢复它)。我们现在可以在原始列表和t之间来回跟踪指针。
  • 遍历原始列表,对于每个单元格c,让c.next.b成为指向c.random.next的指针。 (c.nextt中的单元格,c.random.next}也是如此。这样,b中单元格的t字段就是原始列表中random指针结构的副本。
  • 恢复原始列表:对于每个k,让t[k].a.next指向t[k+1].a.next
  • 制作t链接列表:对于每个k,让t[k].a指向t[k+1]

与shg的链接相反,此解决方案的缺点是需要在内存中连续块大小为n。

答案 3 :(得分:0)

列表中的每个节点都有两个引用:“Next”和“Random”。假设“Random”始终引用前一个。你得到双链表。不失一般性,您可以应用克隆双链表的过程来克隆您的列表。检查 this 以及如何回答他们克隆DL列表的方​​式。复杂性应该是O(n)。