有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,
另一个random随机指向链表中的任一个节点,可能是自己或者为空,
写一个程序,要求复制这个链表的结构并分析其复杂性。
解法:
如果允许改变原链表的值(当然,最后可以还原),则可以O(n), 扫描两遍就行了,不需要hash,并且用常数的额外空间(复制出来的不算):
第一遍:创建L',其中只设置next指针指向下一个节点,random指针复制原链表L对应节点的next域,而原L链表的next节点用来指向L'中的对应节点,random指针不变。这些都可以一遍扫描做到
第二遍:L和L'从头到尾一起遍历一边,每个节点设置L'中的random指针(利用L中的next和random域),然后恢复L中的next指针域
这样就OK了
如果不允许修改L的值,似乎就只能用hash了,主要存L到L'中节点的对应,需要O(n)的空间,时间也是O(n)