题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制这个链表的结构并分析其复杂性
解决方法一:
O(n)的复杂度,扫面两边即可。
图【1】
图【1】是需要复制的链表
图【2】
如图【2】所示,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;
解决方法二:
也是O(n)的时间复杂度。。。
图【3】
如图【3】,第一次遍历将要复制的链表A’ B’ C’ D’插入员链表中,然后再一次遍历复制random指针:A->next->random=A->random->next;
恢复很简单:A->next=A->next->next;A’-next=A’->next->next;
Reference: http://www.cppblog.com/yuech/archive/2011/04/02/143318.html