C语言数据结构-----链表类型详解及链表练习题

0.前言

之前我讲解了循序表以及单链表,接下来我会在介绍几个不同的链表,并举例相关习题使大家能够更加深入的理解。
前期内容如下:
链接: 顺序表(动态顺序表增删查改的代码实现)
链接: 单链表(无头单向不循环)增删查改的代码实现
链接: [双向链表增删查改的代码实现] 紧张制作中

文章目录

  • 0.前言
  • 1.带哨兵位头节点的链表
  • 2.双向链表
  • 3.链表习题一,反转链表(不带哨兵位)
  • 4.链表习题二,链表分割(带哨兵位)
  • 5.链表习题三,带环链表(多个题目环环相扣)
    • 5.1 判断是否有环?
    • 5.2 判断入环节点的位置
    • 5.3 附加问题(如果慢指针一次一步,快指针一次三步,会相遇嘛?)


1.带哨兵位头节点的链表

在这里插入图片描述
哨兵位头节点有什么作用?
当一个链表为空的时候,如果没有哨兵位,那么是直接指向NULL的。如果有哨兵位,那么先指向head,再指向NULL。如图所示:

在这里插入图片描述

2.双向链表

在这里插入图片描述

带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都
是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带 来很多优势,实现反而简单了。

在这里插入图片描述
除此之外还有带环链表,下面的习题中我会进行讲解。
还有双向链表的增删查改,后续我也会放在我的gitee中供大家学习。

3.链表习题一,反转链表(不带哨兵位)

在这里插入图片描述

思路: 在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) 
{
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* pre,*mid,*last;
    pre=NULL;
    mid=head;
    last=head->next;

    while(mid!=NULL)
    {
        mid->next=pre;
        pre=mid;
        mid=last;
        if(last!=NULL)
        last=last->next;
    }
    return pre;
}

4.链表习题二,链表分割(带哨兵位)

在这里插入图片描述
这个题是什么意思呢?
在这里插入图片描述

思路:在这里插入图片描述

但是如果是极端情况,比如val的值为1,tail1的next指向head2,就需要单独处理,不仅仅需要处理tail1还需要处理head1,因为默认情况下两个链表都不为空,返回head1;如果所有值都比val小,没有比它大的,那么第二个链表就会为空。
尾插后还需要一定的链接,这就是这题的复杂所在,那么头节点可以帮我们省去一定的麻烦。

如果这里我们使用带哨兵位的头节点,那么就会省去很多麻烦。使用了哨兵位,那么我们的head1和head2始终不会为空。如图所示:
在这里插入图片描述

ListNode* partition(ListNode* pHead, int x) 
    {
        struct ListNode* head1,*tail1,*head2,*tail2;
        head1=tail1=(struct ListNode*)malloc(sizeof(struct ListNode));//
        head2=tail2=(struct ListNode*)malloc(sizeof(struct ListNode));//malloc出哨兵位的头节点
        struct ListNode* cur=pHead;//原链表的头

        while(cur!=NULL)
        {   
            if(cur->val<x)//小于x的尾插到链表1
            {
                tail1->next=cur;
                tail1=tail1->next;
            }
            else //大于等于x的尾插到链表2
            {
                tail2->next=cur;
                tail2=tail2->next;
            }
            cur=cur->next;//下一个循环
        }
        tail1->next=head2->next;//体现了哨兵位的方便
        tail2->next=NULL;
        pHead=head1->next;
        free(head1);
        free(head2);//释放malloc的空间
        return pHead;     
    }

5.链表习题三,带环链表(多个题目环环相扣)

5.1 判断是否有环?

在这里插入图片描述

思路:
在这里插入图片描述

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

5.2 判断入环节点的位置

在这里插入图片描述

思路:
在这里插入图片描述

struct ListNode *detectCycle(struct ListNode *head)
{
    struct ListNode* slow,* fast;
    slow=fast=head;
    while((fast!=NULL)&&((fast->next)!=NULL))
    {
        //慢指针走一步,快指针走两步
        slow=slow->next;
        fast=fast->next->next;
        
        if (slow==fast)
        {
            struct ListNode* meet=fast;//快慢指针相遇的话,让meet为相遇点
            while(head!=meet)
            {
                head=head->next;
                meet=meet->next;
            }
            return meet;
        }
    }
    return NULL;
}

5.3 附加问题(如果慢指针一次一步,快指针一次三步,会相遇嘛?)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/133684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python实现局部二进制算法(LBP)

1.介绍 局部二进制算法是一种用于获取图像纹理的算法。这算法可以应用于人脸识别、纹理分类、工业检测、遥感图像分析、动态纹理识别等领域。 2.示例 """ 局部二进制算法&#xff0c;计算图像纹理特征 """ import cv2 import numpy as np imp…

AI爆文变现脚本:易用且免费的自动写作脚本更新了

之前给大家分享的AI爆文变现写作脚本 由于时间仓促&#xff0c;加上我对很多东西不熟悉 免费版本对新手小白来说&#xff0c;安装部署起来是非常的困难 于是这几天我加班加点把整个软件的部署简化 现在无需复杂的环境配置安装&#xff0c;下载配置下就可以使用了。 免费版…

LeetCode | 138. 随机链表的复制

LeetCode | 138. 随机链表的复制 OJ链接 思路&#xff1a; 题目要求我们拷贝一个带next指针与random随机访问指针的链表。 如果只拷贝一个只带next的指针&#xff0c;直接遍历目标链表依次拷贝每个节点的信息就可以了~~ 拷贝节点插入到原节点的后面处理copy节点的randomcop…

PyBind11五分钟入门【Python/C++调用】

从 Python 调用 C 基本上有两种方法&#xff1a;使用 PyBind11 C 库生成 Python 模块&#xff0c;或使用 cytpes Python 包访问已编译的共享库。 使用 PyBind11 我们可以更轻松地共享许多数据类型&#xff0c;而使用 ctypes 是一种低级 C 风格的解决方案。 在线工具推荐&#x…

蓝桥杯每日一题2023.11.11

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题首先想到的是暴力分析&#xff0c;使用前缀和&#xff0c;这样方便算出每一区间的大小&#xff0c;枚举长度和其实位置&#xff0c;循环计算出所有区间的和进行判断&#xff0c;输出答案。 非满分暴力写法&#…

图形界面应用案例——关灯游戏(以及扩展)(python)

7.8 图形界面应用案例——关灯游戏 题目: [案例]游戏初步——关灯游戏。 关灯游戏是很有意思的益智游戏,玩家通过单击关掉(或打开)一盏灯。如果关(掉(或打开)一个电灯,其周围(上下左右)的电灯也会触及开关,成功地关掉所有电灯即可过关。 图7-43 关灯游戏运行效…

Spring中的循环依赖解决方案

前言&#xff1a;测试环境突发BeanCurrentlyInCreationException&#xff0c;导致后端服务启动失败&#xff0c;一看就是Spring的Bean管理中循环依赖。项目中存在Bean的循环依赖&#xff0c;是代码质量低下的表现。多数人寄希望于框架层来给擦屁股&#xff0c;造成了整个代码的…

相机内外参实践之点云投影矢量图

目录 概述 涉及到的坐标变换 深度值可视化 3D点云的2D投影实现 实现效果 参考文献 概述 Camer的内外参在多模态融合中主要涉及到坐标系变换&#xff0c;即像素坐标、相机坐标以及其他坐标系。这篇就针对点云到图像的投影与反投影做代码实践&#xff0c;来构建一张具有深度…

MYSQL 慢查询和慢查询日志

在数据库管理中&#xff0c;慢查询是指执行时间较长的 SQL 查询语句。这类查询可能导致系统性能下降&#xff0c;影响用户体验。为了帮助识别和解决这些性能问题&#xff0c;数据库管理系统通常提供了慢查询日志&#xff0c;用于记录执行时间超过一定阈值的查询。本文将深入探讨…

【pytorch深度学习】使用张量表征真实数据

使用张量表征真实数据 本文为书pytorch深度学习实战的一些学习笔记和扩展知识&#xff0c;涉及到的csv文件等在这里不会给出&#xff0c;但是我会尽量脱离这一些文件将书本想要表达的内容给展示出来。 文章目录 使用张量表征真实数据1. 加载图像文件2. 改变布局3. 加载目录下…

[工业自动化-12]:西门子S7-15xxx编程 - PLC从站 - ET200 SP系列详解

目录 一、概述 1.1 概述 二、系统组成 2.1 概述 2.2 与主站的通信接口模块 2.3 总线适配器 2.4 基座单元 2.5 电子模块 2.6 服务器模块 一、概述 1.1 概述 PLC ET200 SP 是西门子&#xff08;Siemens&#xff09;公司生产的一款模块化可编程逻辑控制器&#xff08;PL…

苹果手机安装未上架APP应用测试教程

STEP 2&#xff1a;找到下载的描述文件&#xff08;如果没有找到&#xff0c;请到 设置 - 通用 - 描述文件 中查看&#xff09; STEP 3&#xff1a;安装描述文件 STEP 4&#xff1a;输入解锁密码安装描述文件 STEP 5&#xff1a;同意免责声明&#xff0c;安装描述文件 STEP 6…

开发知识点-Ant-Design-Vue

Ant-Design-Vue a-input a-input Vue组件 a-spin 加载中的效果 data字段 mounted钩子函数 Ant Design Vue 组件库 list-type“picture-card” 上传的图片作为卡片展示 name show-upload-list action :beforeUpload“handleBeforeUpload” :headers“customHeaders” :disabl…

springboot调用第三方接口json转换成对象

请求接口是一个比较常见的需求&#xff0c;接口返回一般是一个json类型&#xff0c;需要进行组装成对应的类&#xff0c;例 {"status_code": 200,"message": "success","data": {"cost": 286.6933,"bom_list": […

人工智能基础——Python:Matplotlib与绘图设计

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

使用ResponseSelector实现校园招聘FAQ机器人

本文主要介绍使用ResponseSelector实现校园招聘FAQ机器人&#xff0c;回答面试流程和面试结果查询的FAQ问题。FAQ机器人功能分为业务无关的功能和业务相关的功能2类。 一.data/nlu.yml文件   与普通意图相比&#xff0c;ResponseSelector训练数据中的意图采用group/intent格…

Vue 3 打印解决方案:Vue-Plugin-HiPrint

文章目录 1. Vue-Plugin-HiPrint 简介2. 安装和使用2.1 安装2.2 引入并注册插件2.3 在组件中使用 3. 配置和高级用法4. 示例应用5. 总结 &#x1f389;欢迎来到Java学习路线专栏~Vue 3 打印解决方案&#xff1a;Vue-Plugin-HiPrint ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f37…

x3daudio1_7.dll怎么解决?x3daudio1_7.dll丢失的5个详细处理方法

首先&#xff0c;让我们来了解一下X3DAudio1_7.dll丢失的原因。X3DAudio1_7.dll是一个非常重要的动态链接库文件&#xff0c;它负责处理计算机中的音频输出。然而&#xff0c;由于各种原因&#xff0c;例如软件安装错误、病毒感染、系统升级等&#xff0c;我们可能会遇到X3DAud…

超强C语言跨年烟花代码,精美无比,附源码分步解析

现在大家是不是都觉得程序员不懂浪漫&#xff1f;那真的大错特错&#xff0c;今天就让你们看看什么是程序员的浪漫&#xff01; 我们今天就来写写《烟花》表白程序&#xff0c;不要惊讶&#xff0c;不要激动&#xff0c;学会了快去拿给心中的那个人看&#xff01;&#xff01;…

【论文解读】针对生成任务的多模态图学习

一、简要介绍 多模态学习结合了多种数据模式&#xff0c;拓宽了模型可以利用的数据的类型和复杂性&#xff1a;例如&#xff0c;从纯文本到图像映射对。大多数多模态学习算法专注于建模来自两种模式的简单的一对一数据对&#xff0c;如图像-标题对&#xff0c;或音频文本对。然…