我有一个单向链表。除了正常的“下一个”指针之外,每个节点中还有一个指向列表中某个随机节点的指针(random ptr)。如何创建这样一个列表的克隆?(时间复杂度应小于O(n^2))。
有没有使用Java的任何建议或解决方法?
我有一个单向链表。除了正常的“下一个”指针之外,每个节点中还有一个指向列表中某个随机节点的指针(random ptr)。如何创建这样一个列表的克隆?(时间复杂度应小于O(n^2))。
有没有使用Java的任何建议或解决方法?
您可以按顺序克隆所有节点,并在此第一遍遍历期间构建一个身份映射,将每个原始节点与其克隆体关联起来。
然后进行第二次遍历,对于每个原始节点,获取其关联的随机节点,然后从映射中获取相应的克隆体,并将原始节点的克隆体与随机节点的克隆体关联起来。整个过程仍然是O(n)。
有两种方法:
1)对所有节点的地址进行哈希,并存储随机指针指向的节点。 (总体复杂度为O(n)
。)
2)另一种O(n)解决方案如链接所示(不使用任何额外空间):http://www.geeksforgeeks.org/archives/1155
这里有一个O(n)时间和O(1)空间的答案。 (使用哈希表或关联映射的解决方案需要O(n)空间)。 shg的链接也是一个O(n)时间和O(1)空间的解决方案。
与shg的链接相反,这个解决方案的缺点是需要在内存中连续地保留大小为n的块。