复杂链表的***,c++

复杂链表的复制

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

class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if (pHead == nullptr)
            return pHead;
        // map<label, 位置>
        map<int, int> imap;
        int count = 0;
        auto pin2 = pHead;  
        // 初始化
        RandomListNode* head = new RandomListNode(pHead->label);
        auto pin1 = head;
        imap.insert(make_pair(pin2->label, count++));
        while (pin2->next != nullptr){
            // 插入点
            auto temp = new RandomListNode(pin2->next->label);
            pin1->next = temp;
            pin1 = pin1->next;
            pin2 = pin2->next;
            // 记录值
            imap.insert(make_pair(pin2->label, count++));
        }       
        // 此时所有节点新建完成
        pin1 = head;
        pin2 = pHead;
        while(pin2 != nullptr){
            if (pin2->random != nullptr){
                auto pin = head;
                auto target = pin2->random->label;
                auto n = imap.find(target)->second;
                for (int i = n; i != 0; --i)
                    pin = pin->next;
                // pin此时所指是pin2的random节点
                pin1->random = pin;
            }
            pin1 = pin1->next;
            pin2 = pin2->next;
        }
        return head;
    }
};

首先抒发一下自己的感想:
1、刚开始做题的时候->看了题没有思路,看了大家的思路也不会写
2、一段时间->看了题没有思路,看了大家思路后开始自己尝试写,不会的再参考
3、现在->看了题开始构思,自己实现并积极找bug
生活不易,大家砥砺前行


言归正传,本题是***复杂链表,思索后采用以下思路:
1、从头节点开始遍历,跟着->next方向建立所有的节点出来,同时用map<label, pisition>记录每个值在链表的什么位置(这里大胆假设每个节点的值都不一样,否则我也没招了,,)
2、此时有了链表雏形,接下来为每个节点链接random。也沿着老链表的->next遍历,根据每个节点->random的label锁定random节点的位置,为相应新节点建立random链接。
欢迎大家交流指正!!!

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:27
明天又是董事长面,啥时候是个头啊
在太阳里长大的人:公司就仨人吧😂
点赞 评论 收藏
分享
Gaynes:查看图片
点赞 评论 收藏
分享
每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
07-11 13:16
湖南工学院 Java
点赞 评论 收藏
分享
评论
12
2
分享

创作者周榜

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