一个单链表除了next指针外,还带有一个随机指针(设为rand)指向任意元素,用最少的时间复杂度和最少的空间复制该链表。
可以用O(n)的时间复杂度和O(1)的附加空间实现:
1.根据源链表依次复制出新链表的对应节点,并将新节点插入到源节点后,新链表的random指针指向原链表的random;
2.然后遍历一遍链表,将新链表节点的random指针指向对应元素的next元素(即新链表中对应的random指针元素);
3.最后将新链表和源链表分离。
代码如下:
RandomListNode *copyRandomList(RandomListNode *head) {
// write your code here
RandomListNode *p = head;
RandomListNode *dest, *t = NULL;
while (p != NULL) {
t = new RandomListNode(p->label);
t->next = p->next;
t->random = p->random;
p->next = t;
p = t->next; //取得源链表中的下一个结点
}
p = head;
while (p != NULL) {
t = p->next;
if (t->random != NULL) { // 此处需要判断源节点的random是否为空,如果不为空才需要更新
t->random = t->random->next;
}
p = t->next;
}
p = head;
dest = p->next;
while (p != NULL) {
t = p->next;
p->next = t->next; //新旧链表分离的旧(源)链表
p = t->next;
if (p != NULL) {
t->next = p->next; //新旧链表分离的新链表
}
}
return dest;
}