您的位置:首页 > 其它

复制带随机指针的链表

2015-07-16 15:58 393 查看
一个单链表除了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: