剑指offer 35-复杂链表的复制 C++

8 篇文章 0 订阅

题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路1:
1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
2、重新遍历链表,复制老结点的随机指针给新结点
3、拆分链表,将链表拆分为原链表和复制后的链表

/*
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==nullptr)
            return nullptr;
        //1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
        RandomListNode* node=pHead;
        while(node!=nullptr){
            RandomListNode* clonenode = new RandomListNode(node->label);
            clonenode->next = node->next;
            // clonenode->random = node->random;
            node->next = clonenode;
            node = clonenode->next;
        }
        //2、重新遍历链表,复制老结点的随机指针给新结点
        node = pHead;
        while(node!=nullptr){
            RandomListNode* clonenode = node->next;
            if(node->random==nullptr)
                clonenode->random = nullptr;
            else
                clonenode->random = node->random->next;
            node = clonenode->next;
        }
        //3、拆分链表,将链表拆分为原链表和复制后的链表
        node = pHead;
        RandomListNode* cloneHead=node->next;
        while(node!=nullptr){
            RandomListNode* clonenode=node->next;
            node->next = clonenode->next;    //node->next->next;
            node = node->next;
            if(clonenode->next==nullptr)
                clonenode->next=nullptr;
            else
                clonenode->next = node->next;
           // clonenode = clonenode->next;
        }
        return cloneHead;
    }
};

思路2:使用哈希表 【哈希表参考讨论区大佬的做法,建议大家无事多逛讨论区,真的能刷新眼界】

class Solution {
    public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if (pHead == nullptr)
            return nullptr;

        //定义一个哈希表
        std::unordered_map<RandomListNode*, RandomListNode*> hash_map;

        //遍历链表,复制每个节点,将每个复制节点插在每个原节点后
        for (RandomListNode* p = pHead; p != nullptr; p = p->next)
        {
            hash_map[p] = new RandomListNode(p->label);
        }
        //根据hashmap中保存的值,找到对应的节点
        for (RandomListNode* p = pHead; p != nullptr; p = p->next)
        {
            hash_map[p]->next = hash_map[p->next];
            hash_map[p]->random = hash_map[p->random];
        }

        return hash_map[pHead];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值