A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
// Note: The Solution object is instantiated only once and is reused by each test case.
RandomListNode *p = head,*q = NULL,*ret=NULL;
if(head == NULL) return ret;
while(p != NULL){
RandomListNode *cur = new RandomListNode(p->label);
cur->next = p->next;
p->next = cur;
p = cur->next;
}
p = head;
ret = head->next;
while(p != NULL){
p->next->random = (p->random != NULL)? p->random->next:NULL;
p = p->next->next;
}
p = head;
while(p!=NULL){
q = p->next;
p->next = q->next;
q->next = (p->next==NULL)?NULL:p->next->next;
p = p->next;
}
return ret;
}
};
304 ms
方法:转自http://www.cnblogs.com/lautsie/p/3259724.html
一个单链表,其中除了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;