

这道题复制next指针很容易,只需要遍历原链表,将原链表每个节点的val赋给我们malloc出的新节点就行了。真正的难点在于怎么拷贝random指针,显然,如果我们一开始就单独创建一个新链表,那么random指针就永远无法处理,因为原链表与新链表每个节点的地址都不同,就算我们记录下random指针指向的节点存的val,然后再遍历新链表找相同的值,也是不行的,因为一个链表中可能有多个节点存了相同的val。
那么这题该怎么解呢?有一个十分巧妙的方法,我们要三次遍历链表。
第一次先将原链表每个节点后面复制一个相同的节点(val的值相同)
如下图:

第二次遍历一遍原链表,假如我们新复制的节点是copy,原节点是cur,只要令copy->random=cur->random->next,是不是就完美的将random指针所指向的节点的相对位置拷贝过来了,然后再跳到下一个节点,重复相同的操作。
第三次遍历一遍原链表,只需将我们新建的节点分离出来,连成一条新链表就行了。
完整代码如下:
struct Node* copyRandomList(struct Node* head) {
struct Node* cur = head;
while (cur) {
struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
copy->val = cur->val;
copy->next = cur->next;
cur->next = copy;
cur = copy->next;
}
cur = head;
while (cur) {
struct Node* copy = cur->next;
if (cur->random == NULL) { copy->random = NULL; }
else {
copy->random = cur->random->next;
}
cur = copy->next;
}
struct Node* copyhead = NULL; struct Node* copytail = NULL;
cur = head;
while (cur)
{
struct Node* copy = cur->next;
struct Node* next = copy->next;
if (copytail ==NULL) {
copyhead = copy;
copytail = copy;
}
else {
copytail->next = copy;
copytail = copytail->next;
}
cur->next = next;
cur = next;
}
return copyhead;
}
那么本期内容就到这里了,觉得有收获的同学们可以给个点赞、关注、收藏哦,谢谢大家。
292

被折叠的 条评论
为什么被折叠?



