复制复杂链表 C语言

请实现一个函数可以复制一个复杂链表。

在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针(随机指针)指向链表中的任意结点或者null。

注意

  • 函数结束后原链表要与输入时保持一致。
数据范围

链表长度 [0,500][0,500]。

解题思路:

(1)创建一个与原链表相同的链表,但是链表的每一个节点的随机指针设置为空

(2)遍历原链表,复制其随机指针到新建的链表(利用地址之间的差值来计算)

/**
 * Definition for singly-linked list with a random pointer.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 *     struct ListNode *random;
 * };
 */
struct ListNode *copyRandomList(struct ListNode *head) {
    if(!head) 
        return NULL;
        
    struct ListNode *chead,*p,*q,*t;
    chead=(struct ListNode *)malloc(sizeof(struct ListNode));
    chead->val=head->val;
    chead->random=NULL;
    
    p=chead;
    q=head->next;
    while(q)
    {
        t=(struct ListNode *)malloc(sizeof(struct ListNode));
        t->val=q->val;
        t->random=NULL;
        p->next=t;
        p=t;
        q=q->next;
    }
    p->next=NULL;
    
    p=chead;
    q=head;
    while(q)
    {
        if(q->random)
            p->random=p+(q->random-q);    //q->random-q q->random与q的距离,也是p->random和p的距离
        else
            p->random=NULL;
        p=p->next;
        q=q->next;
    }
    return chead;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值