【数据结构】链表相关题目(简单版)

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

《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode

🚀write in front🚀
📜所属专栏: 初阶数据结构
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我你们将会看到更多的优质内容!!

《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode

前言

  在学完了顺序表的基本知识后,我们可以通过一些习题来巩固所学知识!

习题1:

删除链表中等于给定值 val 的所有结点。oj链接
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
这道题目有两种做法:

  • 方法一:双指针的遍历,通过双指针来查找删除节点并连接后面的节点,但是缺点就是会有特殊情况需要考虑(头删的情况),代码如下:
    《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  • 方法2:通过遍历,将节点尾插到新链表,最后返回新链表,代码如下:
struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode*cur=head,*newnode=NULL,*tail=NULL;
    while(cur)
    {
        if(cur->val!=val)
        {
            if(newnode==NULL)
            {
                newnode=cur;
                tail=cur;
            }
            else
            {
                tail->next=cur;
                tail=tail->next;
            }
          cur=cur->next;
        }
        else
        {
            struct ListNode*next=cur;
            cur=next->next;
            free(next);
        }
    }
if(tail)
{
    tail->next=NULL;
}
  return newnode;
}

习题2

反转一个单链表。oj链接
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
这道题也有两种方法,

  • 方法1:用三指针的方法,前两个来改变每个节点的链接关系,最后一个节点用来标记位置方便遍历链表
    《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
    代码如下:
    《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  • 方法2:取每个节点头插到新链表:

《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode

习题3

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。oj链接
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  这里我们就要介绍一下快慢指针了。通过快慢指针我们可以解决很多问题,以后都会用到。
  那么什么是快慢指针呢?
  顾名思义,快慢指针就是通过两个不同指针步长的不同来遍历链表。
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  这道题我们让一个指针走两步,一个指针走一步,当快指针指向空或快指针的next指向空的时候,慢指针指向位置就是中间节点位置。

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode*slow=head,*fast=head;

    while(fast!=NULL&&fast->next!=NULL)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

衍生题1:

输入一个链表,输出该链表中倒数第k个结点。oj链接
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  其实也是快慢指针的思想,只是这里不是步长的不同,而是起点不同:
  要寻找倒数第k个节点,就让快指针的起点在慢指针的后k步。当快指针指向空的时候,慢指针就指向倒数第k个节点。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode* slow=pListHead;
    struct ListNode* fast=pListHead;
   
    while(k--)
    {
       
         if(fast==NULL)
    {
        return NULL;
    }
     fast=fast->next;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

衍生题2:

给定一个链表,判断链表中是否有环。oj链接
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  这道题也是用快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。比如:陪女朋友到操作跑步减肥。

  那么,为什么快指针每次走两步,慢指针走一步可以?
  假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。
  此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇。
代码如下:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode*fast=head,*slow=head;
    if(head==NULL||head->next==NULL)
    {
        return false;
    }
    fast=fast->next;
    while(fast!=slow)
    {
        if(fast==NULL||fast->next==NULL)
            break;
        fast=fast->next->next;
        slow=slow->next;
    }
    if(fast==slow)
    return true;
    return false;
}

习题4:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的oj链表

  这道题引入了哨兵位,也就是空的头节点。其实,对于链表尾插的时候,需要判断是否为空,比较麻烦,只要我们创建一个空的头节点就可以避免很多情况。

  链表在头插的时候我们不需要头节点;
  链表在尾插的有空的头节点会更方便。
《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode*newnode=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode*tail=newnode;
    tail->next=NULL;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            tail->next=list1;
            tail=list1;
            list1=list1->next;
        }
        else
        {
            tail->next=list2;
            tail=list2;
            list2=list2->next;
        }
    }

if(list1)
    tail->next=list1;
if(list2)
    tail->next=list2;

    return newnode->next;
}

习题5:

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。oj链接

《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode
  这道题我们创建两个新链表(带有哨兵位的空头节点),小于的尾插到一个链表,大于的尾插到另外一个链表,最后将他们连起来即可。

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) 
    {
        // write code here
        struct ListNode*greaternode=NULL;
        struct ListNode*lessnode=NULL,*cur=pHead;
       
        struct ListNode* gtail=greaternode,*ltail=lessnode;
        while(cur!=NULL)
        {
            if(cur->val>=x)
            {
                gtail->next=cur;
                gtail=cur;
                cur=cur->next;
                gtail->next=NULL;
            }
            else
            {
                ltail->next=cur;
                ltail=cur;
                cur=cur->next;
                ltail->next=NULL;
            }
        }
        ltail->next=greaternode->next;
        return lessnode->next;
    }
};

总结

  还是那句话,数据结构需要多画图,并且对各种情况要有十足的把握才能做对题目。
  更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

专栏订阅:
每日一题
c语言学习
算法
智力题
初阶数据结构
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

《简明数据结构》链表专题编程测验题,初阶数据结构,链表,数据结构,leetcode文章来源地址https://www.toymoban.com/news/detail-806373.html

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

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

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

相关文章

  • 【数据结构】二叉树的相关操作以及OJ题目

    当一个树不是满二叉树或完全二叉树时,它是不适合使用数组存储的,它应该使用链式结构来存储。 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点的左子树、根节点的右子树组成的。 从概念中可以看出,二叉树定义是递归式的,因

    2024年03月19日
    浏览(15)
  • 【C语言&&数据结构】简单题目

    ✨作者:@平凡的人1 ✨专栏:《小菜鸟爱刷题》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 为了方便自己的学习以及基于好久没更新博客的原因。特地写了这一篇博客 。💖 本篇博客是一篇记录学习篇,我将之归纳于刷题专栏。方便自己的复习以

    2023年04月08日
    浏览(21)
  • 【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

    目录  1.随机链表的复制 1.2题目描述  1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random   该指针可以指向链表中的任何节点或空节点。        构造这个链表的  深拷贝 。 深拷贝

    2024年03月10日
    浏览(33)
  • 数据结构课程设计题目——链表综合算法设计、带头双向循环链表、插入、显示、删除、修改、排序

      课程设计题目1–链表综合算法设计   一、设计内容   已知简单的人事信息系统中职工记录包含职工编号(no)、职工姓名(name)、部门名称(depname)、职称(title)和工资数(salary)等信息(可以增加其他信息),设计并完成一个简单的人事信息管理系统,要求完成但不

    2024年02月08日
    浏览(19)
  • 全面理解链表数据结构:各种节点操作、做题技巧,易错点分析与题目清单(C++代码示例,不断更新)

    链表是一种线性数据结构,它包含的元素并不是物理上连续的,而是通过指针进行连接。链表中的每个元素通常由一个节点表示,每个节点包含一个数据元素和一个或多个链接(指针)。 链表的主要类型包括: 单向链表 (Singly Linked List):每个节点包含一个指向下一个节点

    2024年02月07日
    浏览(13)
  • 【数据结构】二叉树经典题目

    相信大部分人看了题目描述之后,都会和我一样一脸的懵逼。直到我看到了一个描述才恍然大悟 分为3种情况: 左右都为空 --省略 右为空,左不为空 – 省略 左为空,右不为空–不省略 这里复习一下二叉树的前序遍历、中序遍历、和后序遍历 前序的结果是:ABDEGCF 中序的结

    2024年02月10日
    浏览(18)
  • 【数据结构】栈和队列常见题目

    队列:先进先出 栈:后进先出 队列:先进先出 栈:后进先出 https://leetcode.cn/problems/valid-parentheses/ 做法:遍历字符串 1.当前字符是左括号:进栈 2.当前字符是右括号:出栈顶元素和当前字符比较是否匹配 特殊情况:如果此时栈为空,那么说明不匹配 3.最后如果栈为空,说明

    2024年02月12日
    浏览(8)
  • 【数据结构】二叉树常见题目

    此乃本人自用版本,用于复习回顾! 所以部分题目不会有过大详细的解析,不懂的可以评论!笔者将竭力为你解答 满⼆叉树:如果⼀棵⼆叉树只有度为0的结点和度为2的结点,并且度为0的结点在同⼀层上,则这棵⼆叉树为满⼆叉树 高度为h的满二叉树,共有 2^h -1 个节点 完全

    2024年02月13日
    浏览(8)
  • 数据结构-链表结构-双向链表

    双向链表也叫双链表,与单向链表不同的是,每一个节点有三个区域组成:两个指针域,一个数据域 前一个指针域:存储前驱节点的内存地址 后一个指针域:存储后继节点的内存地址 数据域:存储节点数据 以下就是双向链表的最基本单位 节点的前指针域指向前驱,后指针

    2024年02月04日
    浏览(18)
  • <数据结构> 链表 - 链表的概念及结构

    概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的 1、链表由一系列结点(链表中每一个元素称为结点)组成。 2、结点可以在运行时动态(malloc)生成。 3、每个结点包括两个部分:一个是存储数据元素的

    2023年04月09日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包