C++ 容器map详解and例题:复杂链表的复制

文章详细介绍了C++STL中的map容器,包括其基本操作函数,并提供了一个复杂链表复制的问题。问题的关键在于解决随机指针的复制,提出了递归和使用unordered_map作为已创建节点的映射的解决方案。
摘要由CSDN通过智能技术生成

一.map详解

    C++STL容器类(vector、list、map、set、deque)之一

    map<key,value>

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可能称为该关键字的值(value);
  • key or value 都可以是任何类型,无论是int、float、结构体、类

     基本操作函数
     begin()         返回map头部

     clear()        删除所有元素

     count()         返回指定元素出现的次数

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

     rbegin()        返回一个指向map尾部的逆向迭代器

     rend()          返回一个指向map头部的逆向迭代器

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

     value_comp()     返回比较元素value的函数

二.例题:复杂链表的复制

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

初步思路:

        1.若是普通链表,直接循环创建即可。

        2.由于random指针指向的节点完全随机,且是否创建为未知数。

        3.将会导致,想要创建节点A就先需要创建节点A的random指针指向的节点B,而要创建节点B就先需要创建节点B的random指针指向的节点C,以此构成无限需求链。但是这也启发我们使用递归的思想来创建节点。

具体思路:

        1.递归函数读入需要创建的节点

        2.判断节点是否已经创建:
                (1)若尚未创建:

                        ①new一个新节点,对value初始化

                        ②递归调用函数本身,新参数为需创建节点->next

                        ②递归调用函数本身,新参数为需创建节点->random

                (2)若已经创建:返回已经创建的节点

        3.返回新创建的节点

要点:

        如何判断一个节点是否已经创建?

        想法1:构建标记数组,用数字来标记节点是否已经被创建

        想法1的问题:节点是链表,没有下标,节点的值也许会重复,无法使用节点值来构成下标。

        想法2:通过想法1,就能自然想到使用map。

代码示例:使用函数为copyRandomList(Node* head)

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    unordered_map<Node*, Node*> List;
    Node* copyRandomList(Node* head) {
        if(head==nullptr) return nullptr;
        if(!List.count(head)){
            Node* temp = new Node(head->val);
            List[head] = temp;
            temp->next = copyRandomList(head->next);
            temp->random = copyRandomList(head->random);
        }
        return List[head];
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千天夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值