题目:
思路:
1. 遍历原来的链表并拷贝每一个节点,将拷贝节点放在原来节点的下一个,创造出一个旧节点和新节点交错的链表。
2. 迭代这个新旧节点交错的链表,并用旧节点的 random 指针去更新对应新节点的 random 指针。
3. random 指针已经被赋值给正确的节点, next 指针也需要被正确赋值,以便将新的节点正确链接同时将旧节点重新正确链接。
图示如下:
//如果cur->random不为空,则copyNode->random 为 cur->random->next
if(cur->random)
copyNode->random = cur->random->next;
//分开链接
while(cur)
{
Node *copyNode = cur->next;
Node *next = copyNode->next;
cur->next = next;
if(next)
copyNode->next = next->next;
else
//最后一个拷贝结点的next置为NULL
copyNode->next = NULL;
cur = next;
}
实现代码:
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) {
if(head == NULL)
return NULL;
Node *cur = head;
//在原链表后拷贝一份
while(cur)
{
Node *copyNode = (Node *)malloc(sizeof(Node));
copyNode->val = cur->val;
copyNode->next = NULL;
copyNode->random = NULL;
Node *next = cur->next;
copyNode->next = next;
cur->next = copyNode;
cur = next;
}
cur = head;
//拷贝random
while(cur)
{
Node *copyNode = cur->next;
if(cur->random)
copyNode->random = cur->random->next;
else
copyNode->random = NULL;
cur = cur->next->next;
}
cur = head;
Node *newnode = head->next;
//分开链接
while(cur)
{
Node *copyNode = cur->next;
Node *next = copyNode->next;
cur->next = next;
if(next)
copyNode->next = next->next;
else
copyNode->next = NULL;
cur = next;
}
return newnode;
}