11.14学习笔记

1.new和malloc的区别

最大的区别:new在申请空间的时候会调用构造函数,malloc不会调用

构造函数的作用:(1)给创建的对象建立一个标识符(标识符就是变量名);(2)为对象数据成员开辟内存空间;(3)完成对象数据成员的初始化。

申请失败返回:new申请空间失败后返回的是错误码bad_alloc,malloc申请空间失败后会返回NULL。

属性上:new/delete是C++关键字需要编译器支持,malloc是库函数,需要添加头文件。

参数:new在申请内存分配时不需要指定内存块大小,编译器会根据类型计算出大小,malloc需要显示的指定所需内存的大小。

成功返回类型:new申请内存成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,因此new是类型安全性操作符。malloc申请内存成功则返回void*,需要强制类型转换为所需的类型。

自定义类型:new会先调用operator new函数,申请足够的内存(底层也是malloc实现),然后调用类的构造函数,初始化成员变量,最后返回自定义类型指针;delete先调用析构函数,然后调用operator delete函数来释放内存(底层通过free实现)。malloc/free是库函数,只能动态地申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数。

重载:C++new允许重载,malloc不允许重载。

2.复杂链表复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
/*
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;
        RandomListNode* head = new RandomListNode(pHead->label);
        if(pHead->next == nullptr) return head;
        RandomListNode* pre = pHead;
        RandomListNode* mov = head;
        while(pre->next != nullptr)
        {
            pre = pre->next;
            RandomListNode* node = new RandomListNode(pre->label);
            mov->next = node;
            mov = mov->next;
        }
        for(pre = pHead, mov = head; pre != nullptr; pre = pre->next, mov = mov->next)
        {
            if(pre->random == nullptr) continue;
            RandomListNode* node = pre->random;
            for(RandomListNode* fin = head; fin != nullptr; fin = fin->next)
            {
                if(fin->label == node->label)
                {
                    mov->random = fin;
                    break;
                }
            }
        }
        return head;
    }
};

3.二叉搜索树转换成排序双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
    vector<int> num;
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        TreeNode* res = nullptr;
        if(pRootOfTree == nullptr) return nullptr;
        fin(pRootOfTree, res);
        while(res->left) res = res->left;
        return res;
    }
    void fin(TreeNode* pRootOfTree, TreeNode* &res)
    {
        if(pRootOfTree == nullptr) return;
        fin(pRootOfTree->left, res);
        pRootOfTree->left = res;
        if(res) res->right = pRootOfTree;
        res = pRootOfTree;
        fin(pRootOfTree->right, res);
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值