138. 复制带随机指针的链表
一种方法是用哈希,用哈希的话比较容易想到,实现起来也不难。
下面介绍另一种方法。
思路及代码
1、每经过一个节点便在这个节点的后面插入该节点的浅拷贝,直到链表结束。
2、把浅拷贝变为深拷贝,用p遍历链表、p每次前进2步,p的浅拷贝即为p->next,p->random->next节点便是p的浅拷贝的random值(即p->next->random),random的值改变之后已经变成深拷贝了,此时两个链表还串在一起。
3、把链表拆开,注意此时链表是按照: 原节点1----深拷贝1----原节点2----深拷贝2…串下去的。
代码如下:
struct Node* copyRandomList(struct Node* head) {
if(head == NULL)
return NULL;
struct Node *p = head;
struct Node *newnode = NULL;
struct Node *next = NULL;
while(p != NULL)
{
newnode = (struct Node *)malloc(sizeof(struct Node));
newnode->val = p->val;
newnode->next = p->next;
p->next = newnode;
p = newnode->next;
}
p = head;
while(p != NULL)
{
next = p->next;
if(p->random == NULL)
{
next->random = NULL;
}
else
{
next->random = p->random->next;
}
p = next->next;
}
//以下步骤为拆开链表
newnode = head->next;
next = newnode;
p = head;
while(next != NULL)
{
p->next = next->next;
p = next;
next = next->next;
}
return newnode;
}