随机链表的复制OJ

前言

这道题可谓是链表的试金石,涉及到链表的插入、删除,对代码能力是很大的考验。而且思路也很巧妙,很有价值的一道题。


1.随机链表的复制

138.随机链表的复制
在这里插入图片描述

1.1 思路

这个题目很难整的一点就是,如何处理random.
思路很巧妙的一点就是,将结点拷贝下来后,依次链接在原结点的后面(链表的插入),如下图,这样,如果cur->next不为NULL的话,就有copy->random=cur->random->next,就是一个相对位置的设置很巧妙。遍历原链表,以处理复制链表的random.
接着将复制结点解下来(链表的删除),并恢复原链表。
在这里插入图片描述

1.2 代码

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
	struct Node* cur=head,*next=NULL,*copy=NULL;
    //将复制结点插入在对应结点后
    while(cur)
    {
        
        copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;

        next=cur->next;

        //cur copy next
        cur->next=copy;
        copy->next=next;
        cur=next;
    }
    
    //处理复制结点的random
    cur=head;
    while(cur)
    {
        copy=cur->next;
        if(cur->random==NULL)
            copy->random=NULL;
        else
            copy->random=cur->random->next;
        cur=cur->next->next;
    }

    //将复制结点解下来,并恢复原链表
    struct Node* newhead=NULL,*newTail=NULL;
    cur=head;
    while(cur)
    {
        copy=cur->next;
        next=copy->next;
        if(newTail==NULL)
            newTail=newhead=copy;
        else
        {
            newTail->next=copy;
            newTail=newTail->next;
        }
        cur->next=next;

        cur=next;
    }
    return newhead;
}

总结

这道题如果要求时间复杂度为O(n)的话,上面几乎是唯一解法;且在有思路的情况下,代码实现也需要一定能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值