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);
}
};