复制带随机指针的链表

LeetCode 138. 复制带随机指针的链表     

题目描述:

示例:

 题目分析:

         复制相同链表元素容易,但是使得copy链表的random指针指向和原链表相同就有些麻烦。这里我们提供一种思路:

        1.首先在原链表每个节点的后面开辟一个新节点,使得开辟节点的值与原节点值相同,并插入在复制节点的后面,效果如图:

        2.接下来就应该是random指针指向相同了,由上图我们不难发现,copy节点的random指向恰好为原节点random指向的节点的next指向,即copy->random = cur->random->next;

        3.最后,我们应该做的就是把每个开辟的copy节点解下来,然后链接成一个新的要返回的链表,并且还原原来的链表,效果如下:

    上代码:

struct Node* copyRandomList(struct Node* head) {
	struct Node*cur = head;
    //1.在每个节点后复制相同节点,并插入
    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;
    }
     //2.使random结果一样:copy->random = cur->random->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;
     } 
     //3.copy节点接解下来,链接到一起,还原原链表
     cur = head;
     struct Node*copyHead = NULL,*copyTail = NULL;
     while(cur){
         struct Node*copy = cur->next;
         struct Node*next = copy->next;
         //尾插
         if(copyTail == NULL){
             copyHead = copyTail = copy;
         }else{
             copyTail->next = copy;
             copyTail = copyTail->next;
         }

         cur->next = next;
         cur = next;
     }
     return copyHead;
}

                                                                                                 

                                                                                                                     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值