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

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

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

顺序表

入门级别单链表

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

希望大家看完有所收获哦

目录

1.顺序表

2.链表

3.栈 


1.顺序表

1.1力扣传送

 

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

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

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

int removeElement(int* nums, int numsSize, int val){
if(nums==NULL || numsSize == 0)
{
    return 0;
}
int j=0;
for(int i=0;i<numsSize;i++)
{
    if(nums[i]!=val)
    {
        nums[j]=nums[i];
        j++;
    }
    
}
return j;
}

 为什么最后返回的是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最后是要++的~~~

 

int removeDuplicates(int* nums, int numsSize){
if(nums ==NULL || numsSize==0)
{
    return 0;
}
int j=0;
for(int i=0;i<numsSize;i++)
{
    if(nums[i]!=nums[j])
    {
       j++;
       nums[j]=nums[i];
    }
    
 }
 return j+1;
}

1.3力扣传送门

 

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

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i1=m-1,i2=n-1,total=m+n-1;
while(i1>=0&&i2>=0)
{
    if(nums1[i1]>nums2[i2]) //此时第一个数组最后一个元素更大
    {
        //应该把第一个数组的最后一个元素赋给合并之后的第一个数组的最后一个位置
        nums1[total--]=nums1[i1--];
    }
    else
    {
        nums1[total--]=nums2[i2--];
    }
}
while(i2>=0) //此时i2不为0,说明第一个数组元素都移动结束,直接把第二个数组全复制过去
{
nums1[total--]=nums2[i2--];
}
while(i1>=0)
{
    nums1[total--]=nums1[i1--];
}
}

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

2.链表

2.1力扣传送门

 

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

但是我们要注意一个情况

 

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* removeElements(struct ListNode* head, int val){
while(head&&head->val==val)
{
    head=head->next;
}
if(head==NULL)
return NULL;
struct ListNode*slow = head,*fast=head->next;
while(fast)
{
    if(fast->val == val)
    {
       slow->next=fast->next;
       fast=fast->next;
    }
    else
    {
         slow=slow->next;
    fast=fast->next;
    }
   
}
return head;
}

2.2未完待续。。。 

3.栈

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值