微软面试之拷贝带有random域的linklist

本文详细介绍了如何通过巧妙地利用原始链表的random相对位置,实现链表复制的同时保持时间复杂度O(n)和空间复杂度O(1),解决了链表复制过程中的难点。通过实例分析和代码实现,揭示了解题背后的逻辑和细节,旨在提升读者在数据结构和算法方面的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天终于过了CopyLinkListWithRandomPoint了,犹记得当年和fawks大神住一起的时候,大神还出了这道他当年MS面试的链表题目,
我当时愣是没写出时间复杂度O(n)空间复杂度O(1)的算法,这道题目确实很巧,先把Copy的链表和原来和在一起,利用原来的random的相对位置来Copy新的random,
我当时也想到了利用相对位置这一点,但是算法还是没成型。


其实之前思想已经清楚了,但是代码AC却又是很多细节要想对,感觉又是个20 80原理,哎。。。。


后来还把代码发给某大神去看代码风格,但是没AC,今天写了很多Link代码,应该会有感觉,果然今天AC掉了,
问题在于原来的CreateLinklist出错了,而且random域的错用print很难发现错误,后来发现了这个隐藏的bug,因为后面的新节点还没new出来,
因此new新节点和copy random域要分成两个loop来做,因为copy random要利用原linklist的random 的相对位置和next域。

附上本吊的代码:
RandomListNode *CopyRandomList(RandomListNode *head) {
        if(head==NULL) return NULL;
        RandomListNode* qHead, *p=head,*pNext;//qHead is another copyed list head, p is head moving point
        while(p!=NULL)
        {
            pNext=p->next;
            p->next=new RandomListNode();
            p->next->label=p->label;
            p->next->next=pNext;
            
            
            p=pNext;//point move to original next
        }


		p=head;
		while(p!=NULL)
		{
			if(p->random!=NULL)//process random is null, can not acces next point
                p->next->random=p->random->next;
            else
                p->next->random=NULL;
			p=p->next->next;
		}


        qHead=head->next;
        
        p=head;
        while(1)
        {
            pNext=p->next;
            p->next=p->next->next;
            if(p->next==NULL)//p is original list's last node, process last node case specifically
                break;
            pNext->next=p->next->next;
            
            p=p->next;//point move to original next
        }
        pNext->next=NULL;
        
        return qHead;
    }
我的目标就是将水平提高到和fawks大神一样程度,熟悉DS,熟悉C++,熟悉Alg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值