链表深拷贝

链表深拷贝
假设有如下一个链表:

struct Node
{
int value ;
struct Node *next ;
struct Node *random ;
}
其中,random指向该链表的任意一个节点或者NULL,请编程实现该链表的深拷贝。

Node *deepCopy (Node *head)

/*
 * 程序用来复制一个复杂链表
 * 复杂链表表示:存在2个指针,一个指针之后下一个节点,另外一个随机指针指向随机节点
 * 分成3步:
 * 1. 复制节点,如A-B-C 变成 A-A’-B-B’-C-C’
 * 2. 依次遍历节点A,B,C,将这些节点的随机指针与A’B’C’一致
 * 3. 分离A-B-C和A’B’C’,A’B’C’便是需要求得链表
 * */
//step1. add same node to nodes in list
//step2. init the random pointer
//step3. split the list to two parts, return newNode

Node *deepCopy (Node *head) {
                    Node *p = head, *q = head->next, *newNode = NULL;

    //step 1
    while (p != NULL) {    
        newNode = (Node *)malloc(sizeof(Node));
        newNode->next = p->next;
        p->next = newNode;
        newNode->value = p->value;
        newNode->random = NULL;

        p = q;
        q = q->next;
    }

    //step 2
    p = head;
    q = p->next;
    while (q != NULL) {
        if (p->random != NULL)
            q->random = p->random->next;
        if (q->next == NULL)
            break;
        p = q->next;
        q = p->next;
    }  //step 3
    newNode = head->next;
    p = head; q = p->next;
    while (q != NULL) {
        p->next = q->next;
        if (q->next == NULL)
            break;
        q->next = p->next->next;

        p = p->next;
        q = q->next;
    }
    return newNode;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值