【数据结构】链表OJ题(顺序表)(C语言实现)

这篇具有很好参考价值的文章主要介绍了【数据结构】链表OJ题(顺序表)(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

✏️移除元素

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法

题目链接:原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)
我在这里给大家提供了常规的三种解法,第一种解法是错误示范

解法一:大家首先肯定想到的是边遍历边删除,当然这也是常用的方法,但是实际上这个解法一是错误的

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

大家可以看到在这里我用到了两次for循环进行遍历和删除而且是一模一样的,大家可以看下面的图:【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法
会出现两个相邻的数是一样的,如果你把前面的那个9去除了,那么后面那个9就会移到前面那个数的位置,而此时那个位置已经检查过了,所以第二个9就没发删除,就会遗留下来:
【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法
所以这里就采用两次循环就可以解决,但是问题来了,如果是三个相邻的数相同,是不是就得用三个for循环,那如果是四个,五个呢,所以该解法错误的原因在这里。当然你也可以先找到最多有几个相同并且相邻的数的次数,然后再用for循环当然这也可以,但是太复杂了,大家还是看看解法二。

解法二:该解法用了指针

int removeElement(int* nums, int numsSize, int val)
{

    int* ret = nums;//重新定义一个新的数组空间
    int sum = 0;
    while (numsSize)
    {
        if (*nums != val)
        {
            *ret++ = *nums++;   //把不同的数移到新的数组空间中
            sum++;                     //记录新数组的长度
        }
        else
        {
            nums++;
        }
        numsSize--;
    }
    return sum;
}

解法二是利用了指针,解法才变得简单起来。

解法三:用了两个变量

int removeElement(int* nums, int numsSize, int val) {
    int right = 0 ;
    int left  = 0 ;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] != val)
         {
            nums[left] = nums[right] ;
            left++;
            right++;
         }
        else
            right++;
    }
    return left;
}

在这里也是利用两个变量相互移动及赋值,不过这种解法教于指针更容易理解。

✏️ 删除重复项

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法

题目链接: 删除排序数组中的重复项

解法

int removeDuplicates(int* nums, int numsSize) {
    int left = 0 ;
    int right = 0 ;
    for(int i = 0; i < numsSize-1; i++)
    {
        if (nums[i] != nums[i+1])
        {
             left++;
             right++;
             nums[left] = nums[right] ;
        }
        else
        right++;
    }
    return left+1;
}

在这里还是利用了两个变量来记录数组元素的变化及移动,和上一题的解法三还是挺类似的,不过还是有一点差别。因为上一题我们是先赋值再移动,而这一题我们是先移动再赋值。为什么第二题就要先移动再赋值呢,这是因为我们这里是要保留一个,删除重复的,而第一题是直接删除。

✏️ 合并两个数组

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法

题目链接: 合并两个有序数组

解法

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
     int m1 = m - 1 ;
     int n1 = n - 1 ;
     int sum = m + n - 1 ;
     while(m1>=0 && n1>=0)
     {
         if (nums1[m1] > nums2[n1])
         {
             nums1[sum] = nums1[m1] ;
             m1--;
             sum--;
         }
         else
         {
             nums1[sum] = nums2[n1] ;
            n1--;
            sum--;
         }
     }
     while(n1>=0)
     {
         nums1[sum] = nums2[n1] ;
         n1--;
         sum--;
     }
}

首先这一题无论是初始的两个数组还是后面合并的数组都是要求数据以递增的形式呈现。

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法

上幅图中就是题目所给的两个有序数组和一些条件。
按照题目意思我们只能从后面把数据填进去,如果从前面会覆盖一些数据,造成数据丢失。

利用遍历来做,因为题目要求数据是递增的形式。所以只能利用遍历,一边遍历一边比大小。

在这里又要分两种情况:
第一种:n1还有剩余,m1已经分配完了,如下图所示

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法
在这里m1是已经为0了,所以会跳出循环,然后直接把nums2中剩余的数补到nums1的前面就可以了。

第二种:m1还有剩余,n1已经分配完了,如下图所示

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法
【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法
像这种情况就可以直接结束了。

知道这两种情况后,应该就能明白我们后面为什么会加一个循环,就是为了防止第一种情况的出现。

【数据结构】链表OJ题(顺序表)(C语言实现),数据结构OJ题,数据结构,链表,c语言,OJ题目,开发语言,算法文章来源地址https://www.toymoban.com/news/detail-752796.html

到了这里,关于【数据结构】链表OJ题(顺序表)(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (c语言实现)数据结构链表oj题(2)

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::分析力扣中有关链表的部分题目. 题目来源于:牛客网-题目链接 输入一个链表,输出该链表中倒数第k个结点。 示例: 输入:1,{1,2,3,4,5} 返回值:{5} 创建两个指针: ①

    2024年02月04日
    浏览(45)
  • 【数据结构】——线性表(顺序表加链表),万字解读(加链表oj详解)

    前言 由于之前存在过对两者的区别考虑,所以把他们放在一起来说,更加容易区别和理解 对于有关线性表的概念这里就不展示了,这里主要是介绍线性表里面的这两个结构的知识点 一.顺序表 1.顺序表介绍 顺序表的存储结构和逻辑结构都是相邻的, 这里如果我们把a1的地址

    2024年03月22日
    浏览(76)
  • 顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

    目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组  3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义  2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双向链表 双向链

    2024年01月24日
    浏览(33)
  • 数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)

    在单数组里面历遍找val,如果是val,就删除。不是就跳过。 时间复杂度O(n^2),最坏情况每个都是val。相当于一个等差数列。 比如 下标0开始找,0不是,不动数组 下标1,1不是,不动数组 下标2,2是,删除元素,变成【0,1,2,3,0,4,2】 下标2,2是,删除元素,变成【0,

    2024年01月23日
    浏览(54)
  • 初阶数据结构之---顺序表和链表(C语言)

    线性表: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构,也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上存储时,通常以 数组 和 链式结构 的形式存储。

    2024年02月22日
    浏览(42)
  • 数据结构:链表基础OJ练习+带头双向循环链表的实现

    目录 一.leetcode剑指 Offer II 027. 回文链表 1.问题描述 2.问题分析与求解 (1) 快慢指针法定位链表的中间节点 (2) 将链表后半部分进行反转 附:递归法反转链表 (3) 双指针法判断链表是否回文 二.带头双向循环链表的实现 1.头文件 2.节点内存申请接口和链表初始化接口 3.链表的打

    2024年02月02日
    浏览(40)
  • 【数据结构篇C++实现】- 线性表 - 顺序表和链表

    友情链接:C/C++系列系统学习目录 故事导入: 幼儿园放学时,一个班级的小朋友,一个跟着一个排队出校,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面和后面的一个是谁,就如同一根线把他们串联了起来。如此具有像线一样的性质的表就叫线性表 线性表(

    2024年02月07日
    浏览(39)
  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(35)
  • 数据结构——链表OJ题

    目录   1.给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 2.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 3.变形题:找到链表中倒数第k个

    2024年02月21日
    浏览(34)
  • 【数据结构】二叉树OJ题(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年03月17日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包