【问题标题】:Cloning a singly linked list克隆单链表
【发布时间】:2012-07-29 09:34:14
【问题描述】:

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

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

【问题讨论】:

  • 您好!随机节点是正常列表的一部分吗?所以所有随机节点都指向列表中的某个位置,或者它们指向一些真正随机的东西?
  • @bali182:问题是:每个节点中还有一个指针(随机指针)指向列表中的某个随机节点

标签: java data-structures linked-list


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以按顺序克隆所有节点,并在第一轮中构建一个身份映射,将每个原始节点与其克隆相关联。

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

    【讨论】:

      【解决方案3】:

      有两种方法:

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

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

      【讨论】:

        【解决方案4】:

        列表中的每个节点都有两个引用:“下一个”和“随机”。假设“随机”总是引用前一个。你得到双链表。在不失一般性的情况下,您可以将克隆双链表的过程应用于克隆您的列表。检查 this 所以回答他们如何克隆 DL 列表。复杂度应该是 O(n)。

        【讨论】:

        • 除非随机指针不指向前一个节点,而是指向链表后面175个位置的节点,否则无法应用该算法,因为你还没有克隆节点还没有。
        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2013-02-10
        • 2017-05-16
        • 2010-12-23
        • 2014-08-31
        • 2011-11-27
        • 2013-12-29
        • 1970-01-01
        相关资源
        最近更新 更多