题解 | #复杂链表的复制#

复杂链表的复制

http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba

最笨最直接的方法:

  1. 根据next指针将链表的label值拷贝出来生成新的链表pNode。
  2. 两个链表同时遍历,填充random
  • 每一个元素,内部再两个链表同时遍历
  • 找到第一个的random时,第二个链表也指向正确的random,此时赋值给第二个的random
  • 注意几个特殊情况:random指向空,random指向自己

本方法的时间复杂度O(n+n^2) = O(n^2);空间复杂度O(1)

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
        if(!pHead) return nullptr;
        RandomListNode* p1 = pHead;
        // for label and next
        RandomListNode* pNode = new RandomListNode(p1->label);
        RandomListNode* p2 = pNode;
        while(1){
            if(p1->next == nullptr){
                p2->next = nullptr;
                break;
            }
            RandomListNode* pNew = new RandomListNode(p1->next->label);
            p2->next = pNew;
            p1 = p1->next;
            p2 = p2->next;
        }
        // for random
        p2 = pNode;
        p1 = pHead;
        while(p2){//p2 loop
            if(!p1->random){
                p2->random=nullptr;
                p2 = p2->next;
                p1 = p1->next;
                continue;
            }
            if(p1->random == p1){
                p2->random=p2;
                p2 = p2->next;
                p1 = p1->next;
                continue;
            } 
            
            RandomListNode* cursor1 = pHead;
            RandomListNode* cursor2 = pNode;
            while(cursor1){
                if(p1->random == cursor1){
                    p2->random = cursor2;
                    break;
                }
                cursor1 = cursor1->next;
                cursor2 = cursor2->next;
            }
            p2 = p2->next;
            p1 = p1->next;
        }
        return pNode;
    }
};
全部评论

相关推荐

今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,也有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
03-13 14:21
已编辑
江西警察学院 前端工程师
站队站对牛:红红一大片 天都要塌了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务