leetcode 138. 随机链表的复制(题目详解)

题目链接

这道题复制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;
}

那么本期内容就到这里了,觉得有收获的同学们可以给个点赞、关注、收藏哦,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值