复制一个带random指针的链表

一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素。如何复制这样一个链表呢?

通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的random指针。
很容易想到使用Hash表的做法,先依次遍历原链表,每经过一个节点X,开辟一个新节点Y,然后(key=X的地址,value=Y的地址)存入哈希表。第二次再遍历原链表,根据拓扑结构设置新的链表。需要O(n)的空间,时间也是O(n)。

如果不使用额外的空间,那么要想在旧链表和新链表的对应节点之间建立联系。就要利用链表中多余的指针。
O(n)复杂度,O(1)空间。如图所示,扫描两边即可。

需要复制的链表:

如图所示,ABCD是原来的链表,A’B’C’D’是复制的链表,第一遍扫描顺序复制next指针,把ABCD的next分别指向A’B’C’D’,将A’的next指针指向B,B’的next指针指向C,依次类推:

复制random指针: A’->random=A->random->next

恢复:A->next=A’->next;A’->next=A’->next->next;

参考:

http://wangliangfei4585.blog.163.com/blog/static/44819858201010601840371/

http://www.cppblog.com/yuech/archive/2011/04/02/143318.html

原文地址:https://www.cnblogs.com/lautsie/p/3259724.html