复杂链表的深度拷贝(给定一个链表,每个节点包涵一个额外增加的随机指针,返回这个链表的深度拷贝)

RNode.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef struct RNode {
    int v;
  struct  RNode* ramdom;
   struct RNode * next;
}RNode;

RNode.c

#include"RNode"

RNode *Copy(RNode *head){
    if (head = NULL){
        return NULL;
    }
    //分三步走
    RNode* oldNode = head;
//第一步,只复制节点中value和next,让新节点跟在老节点后边
    while (oldNode != NULL){
        RNode* newNode = (RNode*)malloc(sizeof(RNode));
        newNode->v = oldNode->v;

        RNode* oldNext = oldNode->next;
        newNode->next = oldNext;
        oldNode->next= newNode;
        oldNode = oldNext;
    }
//第二步,再处理ramdom的复制
    oldNode = head;
    while (oldNode != NULL){
        RNode * newNode = oldNode->next;
        if (oldNode->ramdom == NULL){
            newNode->ramdom = NULL;
        }
        else{
            newNode->ramdom = oldNode->ramdom->next;
        }
        oldNode = newNode->next;
    }
   //第三步,把链表拆成两个
    oldNode = head;
    RNode *newHead = head->next;//把新节点的第一个节点保存一下
    while (oldNode != NULL){
        RNode * newNode = oldNode->next;
        oldNode->next = newNode->next;
        if (newNode->next != NULL){
            newNode->next = newNode->next->next;
        }
        oldNode = oldNode->next;
    }
    return newHead;
}
RNode *BuyNode(int v){
    RNode *node = (RNode*)malloc(sizeof(RNode));
    node->v = v;
    node->next = NULL;
    node->ramdom = NULL;
    return node;
}

main.c

#include"RNode"
int main(){
    RNode *n1 = BuyNode(1);
    RNode *n2 = BuyNode(2);
    RNode *n3 = BuyNode(3);
    RNode *n4 = BuyNode(4);
    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n1->ramdom = n3;
    n2->ramdom = n1;
    n3->ramdom = n3;
    n4->ramdom = NULL;
    RNode *rn1 = Copy(n1);
    RNode *rn2 = rn1->next;
    RNode *rn3 = rn2->next;
    RNode *rn4 = rn3->next;
    assert(rn1->v == n1->v);
    assert(rn2->v == n2->v);
    assert(rn3->v == n3->v);
    assert(rn4->v == n4->v);
    assert(rn1->ramdom == rn3);
    assert(rn2->ramdom == rn1);
    assert(rn3->ramdom == rn3);
    assert(rn4->ramdom == NULL);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值