复制带随机指针的链表(详细方法和代码)

一、题目要求

二、解题思路

1、在每个结点后插入一个和此结点值相等的新结点。然后给新结点的随机指针赋值,画图就可以看出,旧结点随机指针不指向空时,新结点的随机指针应该指向旧结点随机指针指向的结点的下一个结点。如图:

 2、用三个指针将链表分割,让cur指向tail,然后三个指针依次向后移动一位。注意循环停止条件。

如图:

 三、代码

typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) {
    //链表为空时返回空
    if(head == NULL){
        return NULL;
    }
	 Node* cur = head;
     //在每一个原结点后插入一个值相同的新结点
     while(cur){
         Node* newNode = (Node*)malloc(sizeof(Node));
         newNode->val = cur->val;
         newNode->next = cur->next;
         cur->next = newNode;
         cur = newNode->next;
     }
     Node* old = head;
     Node* new = old->next;
     //给新结点的每一个随机指针赋值
     while(1){
         if(old->random == NULL){
             //旧结点随机指针指向空的话,新结点的随机指针也指向空
             new->random = NULL;
         }else{
             //画图就可以看出,旧结点随机指针不指向空时,新结点
             //的随机指针应该指向旧结点随机指针指向的结点的下一个
             //结点
              new->random = old->random->next;
         }
         old = new->next;
         //注意循环停止条件
         if(old == NULL){
             break;
         }
         new = old->next;
     }
     Node* cur1 = head;
     Node* cur2 = head->next;
     Node* tail = head->next->next;
     Node* newhead = cur2;
     //用三个指针分割新链表和旧链表
     while(1){
         cur1->next = tail;
         cur1 = cur2;
         cur2 = tail;
         //注意循环停止条件
         if(cur2 == NULL){
             break;
         }
         tail = tail->next;
     }
     //新链表最后一个结点指向空
     cur1->next = NULL;
     return newhead;
}

注意:两个循环把停止条件放在循环里面是因为防止指针越界 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值