首页 > 编程语言 >代码随想录算法训练营第三天 | Leetcode 203 移除链表元素 Leetcode 206 翻转链表

代码随想录算法训练营第三天 | Leetcode 203 移除链表元素 Leetcode 206 翻转链表

时间:2024-07-23 18:25:29浏览次数:11  
标签:ListNode struct 随想录 free next 链表 new Leetcode delete

前言

今天的两道题目都不难,但细节需要注意。如移除链表元素用到的虚拟头节点,翻转链表的思路。翻转链表真是写了忘,忘了写,希望这次能记住。除此之外我决定每天的记录里面增加一个总结八股的部分,将来二刷再翻看文章的时候顺便也能复习八股知识点。

Leetcode 203 移除链表元素

题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/

代码随想录题解:代码随想录 (programmercarl.com)

思路:不难,移除链表元素是基本功,引入虚拟头节点方便了删除节点为头节点的情况。

struct ListNode* removeElements(struct ListNode* head, int val) {
  struct ListNode *ihead;
  ihead=(struct ListNode*)malloc(sizeof(struct ListNode));
  ihead->next=head;
  struct ListNode* cur=ihead;
  while(cur->next!=NULL)
  {
    if(cur->next->val==val)
    {
       struct ListNode* del=cur->next;
       cur->next=cur->next->next;
       free(del);
    }
    else{
        cur=cur->next;
    }
  }
    head=ihead->next;
    free(ihead);
    return head;
}

Leetcode 206 翻转链表

题目链接:https://leetcode.cn/problems/reverse-linked-list/description/

代码随想录题解:代码随想录 (programmercarl.com)

思路:用代码随想录网站的一个动图就能概括了

代码:

struct ListNode* reverseList(struct ListNode* head) {
   struct ListNode *p=NULL;
   struct ListNode *q=NULL;
   while(head!=NULL)
   {
    q=head->next;
    head->next=p;
    p=head;
    head=q;
   }
   return p;
}

C++ new,delete,malloc,free 

1.实现过程

可以这么讲new封装了malloc,delete封装了free,因为new和delete实现过程中的一步就是malloc和free。new的实现机制是先调用malloc函数分配内存空间并返回一个void*的指针,第二步需要类型转换成所需类型,第三步调用对象的构造函数。delete的实现机制是先调用对象的析构函数,再调用free释放空间。

2.具体区别

new,delete是操作符,free,malloc是函数;new,delete内存分配失败时会抛出bad_alloc异常,malloc,free内存分配失败时会返回NULL;new,delete的分配空间大小自动计算,malloc,free的分配空间大小手动计算;new,delete可以重载,malloc,free不可以;new的空间大小一旦设定好就无法改变

3.new[ ]与delete[ ]

主要要谈的是删除时发生的情况。假设如果使用new[3]分配了一个指向对象的指针数组,且这个对象中有指针变量,在删除时只使用delete虽然会把这个指针数组的空间删掉,但对应的对象析构函数只调用了一次,这样剩余两个对象的析构函数没被调用,导致对象里面指针变量的空间没有正确得到释放,会导致内存泄漏,因此我们必须使用delete[]保证正确调用析构函数,释放对象中指针变量的空间。

总结

在写八股知识点总结的过程中我就发现这是一个非常正确的决定,既可以模拟面试时我需要讲出来的话,也可以帮助自己梳理知识点的逻辑,事半功倍。明天要开始学习C++的STL内容了,希望自己可以弄清底层的实现逻辑。

标签:ListNode,struct,随想录,free,next,链表,new,Leetcode,delete
From: https://blog.csdn.net/m0_74853141/article/details/140555092

相关文章

  • C++链表
    引入链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳。与数组的区别链表和数组都可用于存储数据。与链表不同,数组将所有元素按次序依次存储。不同的存储结构令它们有了不同的优势:链表因其链状......
  • 代码随想录算法训练营第20天 | 二叉搜索树中级
    2024年7月22日题235.二叉搜索树的最近公共祖先普通解法还是和普通的祖先一样求即可,再依据搜索树特性进行剪枝即可加速。importjava.util.*;classSolution{Vector<TreeNode>vec1;Vector<TreeNode>vec2;intflag1=0;intflag2=0;publicT......
  • 代码随想录算法训练营第18天 | 二叉搜索树进阶
    2024年7月20日题530.二叉搜索树的最小绝对差使用递归获取中序遍历,然后遍历一遍vector即可得到结果。importjava.util.*;classSolution{Vector<Integer>vec;publicintgetMinimumDifference(TreeNoderoot){//首先得到中序遍历的结果vec......
  • # 代码随想录算法训练营第38天 | 01背包问题:1049.最后一块石头的重量II(最多能装多少)、
    1049.最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/代码随想录https://programmercarl.com/1049.最后一块石头的重量II.html#算法公开课494.目标和https://leetcode.cn/problems/target-sum/description/代码随想录https://programmercarl.com......
  • 力扣第二题——两数相加(链表的讲解与运用,含解决链表问题模板)(含思路详解、完整代码与知
    内容介绍给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],......
  • 代码随想录day7 | 454 四数相加|| 383 赎金信 15 三数之和 18 四数之和
    454四个数相加==0funcfourSumCount(nums1[]int,nums2[]int,nums3[]int,nums4[]int)int{ //1.用哈希表存储nums1和nums2两者之和的所有可能情况 //2.遍历nums3和nums4两者之和的相反数,如果在哈希表中存在,则结果加上哈希表中的值 //3.返回结果 sum1:......
  • 算法-代码随想录-哈希表
    有效的字母异位词思路:数组作为一个简单的哈希表,可以用来记录字符串中每个字符出现的次数。可以设置一个数组,第一轮遍历s中的字符,字符每出现一次,在数组对应位置+1。第二轮遍历t中的字符,字符每出现一次,在数组对应位置-1。最后遍历作为哈希表的数组,如果都为0,则说明每个字符出现的......
  • 每日一题:Leetcode-322 零钱兑换
    力扣题目解题思路java代码力扣题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例......
  • 「代码随想录算法训练营」第十八天 | 二叉树 part8
    669.修剪二叉搜索树题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/题目难度:中等文章讲解:https://programmercarl.com/0669.修剪二叉搜索树.html视频讲解:https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web题目状态:没有思路,看题解过......
  • 数据结构-线性表(单链表)
    线性表-链表顺序表的链式表示顺序表和链表链表链表实现初始化相关操作插入顺序表的链式表示顺序表和链表顺序表可以随机存取表中的任意元素,但插入和删除操作需要移动大量元素。链表不需要使用地址连续的存储单元,即不需要逻辑上相邻的元素在物理位置上也相邻,通......