顺序表、链表刷题指南(力扣OJ)

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

目录

前言

题目一:删除有序数组中的重复项

思路:

题解:

题目二:合并两个有序数组

思路:

分析:

题解:

题目三:反转链表

思路:

分析:

题解:

 题目四:移除链表元素

思路一:

分析:

题解:

思路二:

分析:

题解:

总结


前言

        无论是面试准备还是日常编码实践,解决与顺序表和链表相关的算法问题都是不可避免的挑战,本篇文章旨在帮助你巩固和提升这两个重要数据结构的理解和应用能力。


题目一:删除有序数组中的重复项

 题目描述:顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 示例与提示:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 思路:

         题目中的数组是一个升序的数组,依据这个点,我们可以知道,相同的元素都是紧挨着的,那要想保持升序,后一个元素一定不等于当前元素,且一定比当前元素大。和前边删除元素的思路类似,可以直接在原数组中进行操作。

题解:

int removeDuplicates(int* nums, int numsSize){
int pos=0;int src=0;
    while(src<numsSize-1)
    {
        if(nums[src]!=nums[src+1])
        {
            nums[pos++]=nums[src++];
        }
        else
        src++;
    }
    nums[pos++]=nums[src];//为了防止数组越界访问,导致最后一个元素没有进行赋值,最后在这里补上
    return pos;
}

 顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

题目二:合并两个有序数组

 题目描述:顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 示例与提示:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         合并两个有序数组的思想叫做归并,这种思路在后续的学习中也会经常遇到。有的同学可能会有这样的思路,将两个元素合并,然后qsort排序一下,这样暴力求解。这样解题也可以,但我们学习了空间复杂度和时间复杂度,就要考虑到复杂度问题,以写出好的程序。

 思路:

         注意:题目中给的是非递减排列的整数数组,举个例子:1,3,4,5,7。这样的数组属于递增数组,1,2,3,3,3,5,6。这样的数组属于非递减数组。

         了解清楚题意后,我们介绍一下解题思路,我们可以依次比较两数组中的元素,然后把小的尾插到新数组,这个就是归并的思想。但是这道题目有点不一样,它的第一个数组会很大,是两个数组有效数据个数的和,这里就要求我们把数据归并到第一个数组。

那这道题应该怎么解决呢?

        前边介绍的归并思想,我们是正着比较,然后尾插,那这道题,我们是不是可以倒着比较,然后尾插到第一个数组。

 分析:

        理解了解题的思路后,我们在进行更深一步的分析,由于力扣的题目大都是接口型题目,在调试时会很麻烦,这就是我们刷不动题的原因之一,做好全面的分析才能更高效的解决问题

 情况一:

 顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 从末尾开始,依次比较,较大的数字插入到数组一的末尾:

 顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 依次比较,并进行插入。

 情况二:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         两个数组依然是末尾数据进行比较,然后尾插到数组一,但是这次不同的是,数组一遍历完后,还并没有结束,此时的数据如下:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         这里就需要再将数组二剩下的数据继续插入到数组一当中。

 题解:

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

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         使用3个变量,依次存储第一个数组的有效数据的末尾,第二个数组的末尾,以及第一个数组的末尾。谁大就把他插入到nums1的末尾,最后如果第二个数组没有遍历完,就将剩余数据依次插入到nums1中。

题目三:反转链表

 题目描述:顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 思路:

         数组的反转很简单,最后一个元素和第一个元素交换,然后一个往前,一个往后循环遍历,但这个是单链表,没法向前遍历。那要怎么解决呢?我们可以这样做,遍历这个链表,将每个节点依次改为指向前一个节点,但要确保后续节点不丢失。这里我们就可以创建3个结构体指针,一个指向NULL,一个指向第一个节点,最后指向第二个节点,以便于记录链表后续节点。

分析:

        假设初始是这样的一个链表:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         创建3跟结构体指针,改变节点指向后,向后遍历:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         有人疑惑,链表不是不可以向前遍历吗?那n1怎么到n2的位置?我们可以直接把n2赋值给n1,然后把n3赋值给n2,n3通过指针继续向后遍历。

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 当n2为NULL时就结束。

 题解:

 分析之后,我们就进行具体实现:

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* n1,*n2,*n3;
    n1=NULL;
    n2=head;

    if(n2!=NULL)
        n3=n2->next;

    while(n2)
    {
        n2->next=n1;

        n1=n2;
        n2=n3;

        if(n3!=NULL)
            n3=n3->next;
    }
    return n1;
}

 需要注意的是空指针问题,当n3为空时就不要继续向后遍历了。

 顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 题目四:移除链表元素

 题目描述:

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 思路一:

        这里的思路中规中矩,遍历这个链表,与遇到要删除的val值就删除,但这里需要注意一点特殊情况,尽可能的去多虑特殊情况。

 分析:

         假设初始时给这样一个链表,要删除的是6.顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         但是单一的使用指针找到了val的节点,又没法删,需要知道前一个节点。那可不可以使用替换法,把4替换到6节点的位置,遇到val值节点就把后一个节点替换过来,这样就不用使用两个指针了,但如果要删除的节点是尾节点呢?它可没有后一个节点。所以我们还是使用传统的方法。创建一个指针记录前一个节点。

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         把val值前一个节点next改为val后一个节点的地址,释放掉cur指向的节点。如果删除节点是最后一个,将prev指向节点的next置为NULL。

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         那这种情况呢?如果要删除的节点是头,prev就行不通了。所有我们还需要再多考虑一下头节的情况,进行特殊处理。

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

        初始情况下cur和head都指向头节点,把cur的下一个节点赋值为head,然后释放掉cur指向的第一个节点,再把新的头head赋给cur。这样就可以解决了。

题解:

        分析完整体思路后,我们进行代码实现,代码如下:

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

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

 思路二:

        除了传统的方法,还有另外一种方法——尾插法。遍历原链表,如果不是val就尾插到新链表。

分析:

        可以先创建一个新的链表头,初始时链表头为空,然后依次尾插,插入节点。

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         这种方法更加简单快捷,没有那么多需要考虑的特殊情况,最后返回新的头。

题解:

        这种方法思路虽然很简单,但在实现时有很多需要注意的点:

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* cur=head;
    struct ListNode* newhead=NULL,*tail=NULL;
    while(cur)
    {
        if(cur->val==val)
        {
            struct ListNode* del=cur;
            cur=cur->next;
            free(del);
        }
        else 
        {
            if(tail==NULL)//考虑初始时头和尾都为NULL的情况
            {
                tail=newhead=cur;
            }
            else
            {
                tail->next=cur;
                tail=tail->next;
                
            }
            cur=cur->next;
        }
    }
    if(tail)
        tail->next=NULL;//遍历完之后需要将尾节点next置为NULL,此外还需要注意tail是否为NULL。

    return newhead;
}

顺序表、链表刷题指南(力扣OJ),链表,leetcode,数据结构,算法,c语言

         在刷题时我们会发现,很多的操作都是基于我们前边学习的单链表中基本操作的变形,此外解题的思路在很多情况下都是通用的,只需略微变形就可解决问题。所有一定要学会举一反三。


总结

        刷题不仅是为了应对面试和编码实践,更是为了培养自己的问题解决能力和学习能力。无论是顺序表还是链表,它们都是构建更复杂数据结构的基石,掌握它们对你的编程之路至关重要。最后,感谢阅读!文章来源地址https://www.toymoban.com/news/detail-623993.html

到了这里,关于顺序表、链表刷题指南(力扣OJ)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 链表刷题TOP202

    描述 农场主人有一群牛,他给每只牛都打了一个编号,编号由整数表示。这些牛按照编号的大小形成了一个链表。现在农场主人想删除链表中比前后结点值都大的牛的编号,你能帮他设计一个算法来实现这个功能吗?注意,只考虑删除前,首尾的牛的编号不删除。 题地址

    2024年02月16日
    浏览(38)
  • 【数据结构】链表OJ题(顺序表)(C语言实现)

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

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

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

    2024年03月22日
    浏览(76)
  • 链表刷题常用技巧——快慢指针

    强大,不动如山的强大,不会输给自己的真正的强大。  往期回顾: 数据结构——单链表 单链表力扣刷题 文章目录 经典例题:链表的中间结点 题目分析及双指针思路引入  双指针图解 leetcode 核心代码 判断环形链表——快慢指针延伸为追及问题 题目分析,图解 leetcode 核心

    2024年02月14日
    浏览(29)
  • 【leetcode 力扣刷题】移除链表元素 多种解法

    题目链接:203.移除链表元素 题目内容: 理解题意:就是单纯的删除链表中所有值等于给定的val的节点。上一篇博客中介绍了链表的基础操作,在删除链表中节点时,需要注意的是头节点: 如果没有虚拟头节点,那么对头节点的删除需要做不同的处理,head = head-next; 如果有

    2024年02月12日
    浏览(35)
  • 【leetcode 力扣刷题】链表基础知识 基础操作

    在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】是线性结构的,其中线性表包括顺序表和链表。数组就是顺序表,其各个元素在内存中是连续存储的。 链表则是由 数据域 和 指针域 组成的 结构体 构成的,数据域是一个节点的数据,指针域

    2024年02月12日
    浏览(33)
  • 数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

    有没有一起拼用银行卡的,取钱的时候我用,存钱的时候你用 难度等级:⭐ 直达链接:相同的树 难度等级:⭐ 直达链接:单值二叉树 难度等级:⭐⭐ 直达链接:对称二叉树 难度等级:⭐⭐⭐ 直达链接:二叉树的前序遍历 难度等级:⭐⭐⭐⭐ 直达链接:另一颗子树 注:

    2024年04月16日
    浏览(70)
  • 【数据结构】夯实基础|线性表刷题01

    作者: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: 【数据结构|刷题专栏】:该专栏专注于数据结构知识,持续更新,每一篇内容优质,浅显易懂,不失深度!该专栏题目

    2023年04月09日
    浏览(31)
  • LeetCode 刷题 数据结构 链表 203 移除链表元素

    Given the  head  of a linked list and an integer  val , remove all the nodes of the linked list that has  Node.val == val , and return  the new head . Example 1: Example 2: Example 3: Constraints: The number of nodes in the list is in the range  [0, 104] . 1 = Node.val = 50 0 = val = 50 今天leetcode的中文官网比较卡,所以是登录官网进行

    2024年02月14日
    浏览(27)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)

    目录 一.前言  二.leetcode160. 相交链表  1.问题描述 2.问题分析与求解 三.leetcode141. 环形链表 1.问题描述 2.代码思路  3.证明分析  下一题会用到的重要小结论: 四.leetcode142. 环形链表 II 1.问题描述 2.问题分析与求解 Judgecycle接口: 方法一: 方法二:  单链表和带环单链表

    2023年04月08日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包