• 【C++】顺序表,栈相关练习(每日小细节006)


    我们前几天已经学过了线性表:顺序表,链表和栈,但是只有理论知识是绝对不够的,我给大家找了一些很经典的题目,一定要做到立马有思路哦

    (如果还有小可爱没有看过我的顺序表,链表和栈的知识点说明,请看↓

    顺序表

    入门级别单链表

    带头双向循环链表(进阶版本)

    希望大家看完有所收获哦

    目录

    1.顺序表

    2.链表

    3.栈 


    1.顺序表

    1.1力扣传送

     

    题目要求要原地删除所以我们可以用一个很简单的思想

    因为是数组所以可以用下标表示最好

    再设置一个变量j用来表示“新数组”的下标,只要nums【i】和val不相等,那这个元素就是新数组的其中一个,把他赋给nums【j】,然后j++,如果和val相等,那么j不动,但是i还是照常后移

    1. int removeElement(int* nums, int numsSize, int val){
    2. if(nums==NULL || numsSize == 0)
    3. {
    4. return 0;
    5. }
    6. int j=0;
    7. for(int i=0;i
    8. {
    9. if(nums[i]!=val)
    10. {
    11. nums[j]=nums[i];
    12. j++;
    13. }
    14. }
    15. return j;
    16. }

     为什么最后返回的是j而不是j+1?因为你在赋给nums【j】之后j已经++,不论往后走到底到没到头,j都已经+1了

    1.2

    力扣传送门

     

    我们发现这个题目和上一个非常像所以大家先想想看

    这次还是原地删除,所以还是设置一个j,但是这次是每当i!=j时候先把j向后移一个,然后把nums【i】赋给nums【j】,最后j不用再++,最后返回的时候只要我们下,如果数组是{1,1}那么没有nums【i】!=nums【j】的情况,最后j还是0,但是返回的时候应该是{1},j应该是1,所以我们这种方式j最后是要++的~~~

     

    1. int removeDuplicates(int* nums, int numsSize){
    2. if(nums ==NULL || numsSize==0)
    3. {
    4. return 0;
    5. }
    6. int j=0;
    7. for(int i=0;i
    8. {
    9. if(nums[i]!=nums[j])
    10. {
    11. j++;
    12. nums[j]=nums[i];
    13. }
    14. }
    15. return j+1;
    16. }

    1.3力扣传送门

     

     只需要三个下标,i1表示nums1(含有效数字)最后一个元素的下标,i2表示nums2最后一个元素的下标,最后的total是合并之后数组的(也就是nums1)的最后一个元素下标

    1. void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    2. int i1=m-1,i2=n-1,total=m+n-1;
    3. while(i1>=0&&i2>=0)
    4. {
    5. if(nums1[i1]>nums2[i2]) //此时第一个数组最后一个元素更大
    6. {
    7. //应该把第一个数组的最后一个元素赋给合并之后的第一个数组的最后一个位置
    8. nums1[total--]=nums1[i1--];
    9. }
    10. else
    11. {
    12. nums1[total--]=nums2[i2--];
    13. }
    14. }
    15. while(i2>=0) //此时i2不为0,说明第一个数组元素都移动结束,直接把第二个数组全复制过去
    16. {
    17. nums1[total--]=nums2[i2--];
    18. }
    19. while(i1>=0)
    20. {
    21. nums1[total--]=nums1[i1--];
    22. }
    23. }

    大家一定要记住,顺序表其实就是 加限制条件的数组,对于数组的操作对于顺序表一定满足 ,建议去刷力扣多刷增加手感

    2.链表

    2.1力扣传送门

     

     其实我们只要从头开始遍历,并且这是一个单链要保存它的前一个才能在找到要删除的位置的时候,把前一个节点和后一个节点连接起来

    但是我们要注意一个情况

     

    最好的解决办法就是把头先遍历一下,如果是1111这样的 就先看一下要删的元素是不是1,如果是就把头给给下一个节点,最后一定会把头给到NULL就能成功返回NULL而不是1

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * struct ListNode *next;
    6. * };
    7. */
    8. struct ListNode* removeElements(struct ListNode* head, int val){
    9. while(head&&head->val==val)
    10. {
    11. head=head->next;
    12. }
    13. if(head==NULL)
    14. return NULL;
    15. struct ListNode*slow = head,*fast=head->next;
    16. while(fast)
    17. {
    18. if(fast->val == val)
    19. {
    20. slow->next=fast->next;
    21. fast=fast->next;
    22. }
    23. else
    24. {
    25. slow=slow->next;
    26. fast=fast->next;
    27. }
    28. }
    29. return head;
    30. }

    2.2未完待续。。。 

    3.栈

    这部分内容我们放在下一篇博客,先好好吸收前面的题目

  • 相关阅读:
    Java 将HTML转为XML
    让你秒读懂阿里云数据库架构与选型
    传统算法与神经网络算法,神经网络算法有什么用
    Python武器库开发-面向对象篇(六)
    10、MyBatis的缓存
    Django框架学习大纲
    mfc140.dll丢失如何修复,分享多种有效的修复方法
    初识设计模式 - 解释器模式
    集合贴3——智能客服系统
    求数组最大连续子数组乘积(轮询)
  • 原文地址:https://blog.csdn.net/weixin_71138261/article/details/127812330