随机链表的复制

 这一题的解法,那个DNA的复制差不多,就是利用类似螺旋复制的一个样子然后我们再把链给他取出来就行了

typedef struct Node Node;
Node* copyRandomList(Node* head) {
    if (head == NULL) {
        return NULL;
    }

    Node* cur = head;
    while (cur) {
        Node* copy = (Node*)malloc(sizeof(Node));
        copy->val = cur->val;
        copy->next = cur->next;
        cur->next = copy;
        cur = copy->next;
    }

    cur = head;
    while (cur) {
        Node* copy = cur->next;
        if (cur->random == NULL) {
            copy->random=NULL;
        }
        else
        {
            copy->random = cur->random->next;
        }
        cur = copy->next;
    }

    cur = head;
    Node* newhead = NULL;
    Node* newTail = NULL;
    Node* copy = NULL;

    while (cur) {
        copy = cur->next;
        cur->next = copy->next;
        if (newTail == NULL)
        {
            newhead = newTail = copy;
      }
        else {
            newTail->next = copy;
            newTail = newTail->next;
        }
        cur = cur->next;
    }

    return newhead;
}

第一部分空间,就是把他的复制后的样子给他创建出来,然后第二部分的样子就是处理一下他的这个随机值。然后随机这里有个点,就是它随机值指向的不能是他原本的那个。那个地方是得要是他复制过的,然后第三部分就是。第三部分就是我们把它取出来,这里我们把它取出来之后呢,这里我们没有哨兵位,所以我们直接从头开始尾插,然后我们这里面是没有把它还原的,可以还原一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值