现有一个链表,链表的结构有两个指针域next,rand,其中rand指针的指向未知,现要求你拷贝这个结构,实现O(1)空间复杂度。
1.弱化约束:不要求空间复杂度。
上图3号节点的next和rand都指向null。
如果直接拷贝,拷贝顺序十分重要,因为可以rand指针指向的位置比next指针还要远很多。
解决办法:
1.我们用一个<Node*,Node*>hash表,将1和他的拷贝节点1'【拷贝的只有值域,不包括rand和next域】放入hash,其余节点相同。
2.遍历原始链表,拷贝。以例子做说明:
假设拷贝1号节点,我们可以直接去hash表查询1号节点的next和rand指向的节点的拷贝节点,即
map[Node].next=map[Node.next];
map[Node].rand=map[Node.rand];
2.强化约束:通过弱化约束我们知道,需要一些结构告诉我们节点位置:
我们将上述链表按照下图这种方式拷贝:
先将拷贝节点建立在原节点后方,当我们拷贝1时,1'的rand就指向1的rand->next,其余节点同理,最后将两个链表分离即可。