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

news2024/11/28 1:30:48

在这里插入图片描述

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:分析力扣中有关链表的部分题目.

目录

  • 前言
  • 一、链表中倒数第k个结点
    • 题目描述:
    • 解题思路:
  • 二、合并两个有序链表
    • 题目描述:
    • 解题思路:
  • 三、分割链表
    • 题目描述:
    • 解题思路:
  • 四、链表的回文结构
    • 题目描述:
    • 解题思路:

一、链表中倒数第k个结点

题目来源于:牛客网->题目链接

题目描述:

输入一个链表,输出该链表中倒数第k个结点。

示例:

输入:1,{1,2,3,4,5}
返回值:{5}

解题思路:

  1. 创建两个指针:
    ①:返回指针:ret.
    ②:后指针:tail
  2. 后指针(tail),将该指针先走k-1步.
  3. 两个指针同时走,当后指针走向最后一个结点时,ret刚好走到倒数第k个位置.

特殊情况:
pListHead=NULL和K不合法.

在这里插入图片描述

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    if(pListHead==NULL||(k<=0))//如果为空链表或者k是<=0,直接返回NULL
    {
        return NULL;
    }
    struct ListNode*ret=pListHead;
    struct ListNode*tail=pListHead;
    //后指针先走k-1步
    while((--k)&&tail)//细节,k--和--k的区别
    {
        tail=tail->next;
    }
    //k太大
    if (tail == NULL)//如果指向的就是最后一个节点的后的NULL,即k太大
    {
        return NULL;
    }
    //两个指针一起走
    while(tail->next!=NULL)
    {
        tail=tail->next;
        ret=ret->next;
    }
    return ret;
}

二、合并两个有序链表

题目来源于:力扣->题目链接

题目描述:

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

示例1:
输入:

l1 = [1,2,4], l2 = [1,3,4]

输出:

[1,1,2,3,4,4]

在这里插入图片描述

解题思路:

  可以创建一个头结点,头结点在链表为空等特殊情况时不需要调整头指针,因为即使链表为空,也还有头结点,只需要将头结点的next置空即可.
步骤:

  1. 创建头结点,并初始化头结点的next为NULL.
  2. 由于头结点的指针域(next)需要作为函数的返回值,所以需要再创建一个指针记录头结点.
  3. 只需要分别比较这两个链表的值,谁小谁尾插到新链表,直到一方为空.
  4. 将此时不为空的链表尾插到新链表.
  5. 返回头结点的next;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    //创建带哨兵卫的结点
    struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));
    phead->next = NULL;
    struct ListNode* ret = phead;//保存这个哨兵卫结点
    while (list1 && list2)
    {
        if (list1->val < list2->val)//谁小谁尾插
        {
            phead->next = list1;
            phead = phead->next;
            list1=list1->next;
        }
        else
        {
            phead->next = list2;
            phead = phead->next;
            list2=list2->next;
        }
    }
    //如果一方为空的情况
    if (list1 == NULL)
    {
        phead->next = list2;
    }
    if (list2 == NULL)
    {
        phead->next = list1;
    }
    return ret->next;//哨兵卫结点的next
}

三、分割链表

题目来源于:牛客网->题目链接

题目描述:

  现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

示例:

在这里插入图片描述

解题思路:

  1. 创建两个带头结点的单链表.
    ①:SmallHead:用于保存比目标值小的结点.
    ②:BigHead:用于保存比目标值大的结点.

  2. 由于后面要返回新链表,并且小链表的尾巴要与大链表的头链接,综上,上面的两个头结点不能轻易改变,老样子创建两个指针代替它们遍历.
    ①:SmallTail
    ②:BigTail

  3. 遍历原链表,依次与目标值x比较:
    小于目标值x尾插入SmallHead小链表.
    大于等于==目标值x,尾插入BigHead大链表.

  4. 将小链表与大链表链接起来.
    注意:这里需要注意的是大链表(BigHead)的尾结点不一定是原有链表的尾结点,即大链表(BigHead)的尾结点不一定为NULL,我们要手动设置为NULL,否则链表无法结束.

  5. 最后:由于头结点是自己用malloc手动申请的,c语言阶段,需要我们自己手动释放,释放前记得保存要返回的头指针哦.

图解:
在这里插入图片描述
特殊情况:
在这里插入图片描述

代码:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
    //创建两个链表的头结点
    ListNode* SmallHead=(ListNode*)malloc(sizeof(ListNode));
    ListNode* BigHead=(ListNode*)malloc(sizeof(ListNode));
    //代替两个头结点遍历的指针
    ListNode* SmallTail= SmallHead;
    ListNode* BigTail= BigHead;
    //遍历现有链表
    while(pHead)
    {
        //小的尾插到小的链表中
        if(pHead->val<x)
        {
            SmallTail->next=pHead;
            SmallTail=SmallTail->next;
        }
        else {//大的尾插到大的链表中
            BigTail->next=pHead;
            BigTail=BigTail->next;
        }
        pHead=pHead->next;
    }
    //链接
    SmallTail->next=BigHead->next;
    //大链表的尾结点不一定是NULL,我们要置NULL
    BigTail->next=NULL;
    //保留要返回的头指针
    pHead=SmallHead->next;
    //释放自己动态内存申请的空间
    free(SmallHead);
    free(BigHead);
    return pHead;
    }
};

四、链表的回文结构

题目来源于:牛客网->题目链接

题目描述:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构(从前往后,和从后往前遍历结果一样)。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

示例1:
输入:

1->2->2->1

输出;

true

示例2:

输入:

1->2->3->2->1

输出:

true

解题思路:

将链表的后半段逆序,然后与前半段一次比较,都一样则是回文结构,不一样则不是回文结构.

  1. 寻找中间结点,前面牛牛讲过方法哦,快慢指针就行.
  2. 从中间结点开始,反转原链表的后半段.
  3. 比较链表的前半段与后半段:
    不相同:则返回false
    相同:则返回true

链表中间结点与链表逆置在这篇文章->传送门

图解:
在这里插入图片描述

代码:

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
       //寻找中间结点
        ListNode* mid=middleNode(A);
        //反转链表后半段
        ListNode* B=reverseList(mid);
        //比较
        while(A&&B)
        {
            if(A->val!=B->val)
            {
                return false;
            }
            A=A->next;
            B=B->next;
        }
        return true;
    }
};

本文主要记录牛牛学习链表时刷题记录,希望这篇文章对大家有帮助。欢迎小伙伴们私信提意见和提问哦!
最后,小伙伴们的点赞就是给牛牛最大的支持,能不能给牛牛来一个一键三连呢?谢谢支持。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML第二天

第二天 表格 表格的主要作用 1.表格主要用于显示、展示数据&#xff0c;因为它可以让数据显示的非常的规整&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理2.表格不是用来…

Java基础知识:1,DOS命令

1&#xff0c;盘名称 加 : 进入该盘目录下 例如&#xff1a;e: 进入e盘 2&#xff0c;dir 查看当前路径下文件和文件夹 3&#xff0c;md 文件夹名字 》 创建文件夹&#xff08;md后要加空格&#xff09; &#xff08;md make directory&#xff09; 4&#xff0c;c…

Oracle11g下载与安装

一、Oracle11g下载 官网下载地址&#xff1a;Oracle Database 11g Release 2 for Microsoft Windows (x64) 选择"Accept License Agreement"&#xff0c;点击"win64_11gR2_database_1of2.zip"和"win64_11gR2_database_2of2.zip"&#xff0c;进行…

Debian11之 K3s 部署K8S集群

K3S 架构方案 Server 节点指的是运行 k3s server 命令的主机&#xff0c;control plane 和数据存储组件由 K3s 管理Agent 节点指的是运行 k3s agent 命令的主机&#xff0c;不具有任何数据存储或 control plane 组件Server 和 Agent 都运行 kubelet、容器运行时和 CNI 基于 …

GPUAnimation的Mesh动画烘焙到贴图,学习笔记

0.动画烘焙贴图工具作者 Unity-GPU Animation - 知乎 1.安装学习项目 GitHub - striter/Unity3D-ToolChain_StriteR 复制到URP项目中&#xff0c;并删掉多余报错的和GPUAnimation无关的模块 2.把学习项目中的HLSL搬到低版本Unity的CG版本 安装FBX Exporter把烘焙好的mesh导…

【秒杀系统】高并发编程入门学习

文章目录 一、秒杀系统的基本构成二、秒杀系统的常见问题三、秒杀系统的解决技术 一、秒杀系统的基本构成 二、秒杀系统的常见问题 高并发 大量的请求进来&#xff0c;在Redis缓存层会发生缓存雪崩 缓存击穿 缓存穿透这些问题&#xff0c;这些问题就会打挂MySQL。这样就会导致…

23种设计模式之建造者模式(Builder Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的建造者模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

C++ STL 之 list 的模拟实现

文章目录 &#x1f4cd;前言&#x1f308;STL之list的模拟实现&#x1f388;list_node节点的定义&#x1f388;iterator迭代器&#x1f56f;️构造函数&#x1f56f;️*it&#x1f56f;️->&#x1f56f;️it/it&#x1f56f;️it--/--it&#x1f56f;️! / &#x1f388;l…

[MAUI程序设计]界面多态与实现

文章目录 需求一&#xff1a;在不同设备上使用不同 UI 外观定义控件 UI 外观基于平台自定义配置 需求二&#xff1a;在不同数据类别中使用不同的 UI 外观定义视图 UI 外观创建数据模板创建选择器定义数据 需求三&#xff1a;在不同数据状态中使用不同的 UI 外观使用绑定模型更改…

【腾讯云FinOps Crane 集训营】Crane 助力云原生用户充分发挥云上资源的最大价值,帮助企业降本增效之利器

文章目录 Crane 助力云原生用户充分发挥云上资源的最大价值&#xff0c;帮助企业降本增效之利器前言云上资源成本虚高的现状一、云原生的崛起&#xff1a;服务上云二、服务上云的魔咒&#xff1a;服务健壮了&#xff0c;钱袋子却空了三、钱都去哪了&#xff1a;云资源无序投入的…

golang 微服务的负载均衡

上次我们说了一下 微服务的容错处理&#xff0c;是用的 断路器 这一次我们来一起看看 微服务的负载均衡是如何做的 负载均衡 负载均衡是什么呢&#xff1f; 他能够将大量的请求&#xff0c;根据负载均衡算法&#xff0c;将不同的请求分发到多台服务器上进行处理&#xff0c…

Git Mac设置系统命令别名和Git命令别名

有时候git命令的别名过长要如何&#xff0c;在命令行不方便输入&#xff0c;这时候我们可以设置命令别名。 设置系统命令别名 设置系统命令别名可以在.bash_profile文件中配置&#xff0c;这个文件也是我们经常配置环境变量的地方&#xff0c;这个文件本身是不可见的&#xf…

rtp h264 发送和接收程序的问题

目的 为了自己写一个投屏协议&#xff0c;目前重新启用rtp协议&#xff0c;使用rtp协议直传效率最高&#xff0c;并且使用的是udp ffmpeg 发送rtp ffmpeg的rtp发送时一般把sps和pps放在一个包里面&#xff0c;写接收代码的时候要注意&#xff0c;在单包里面可以直接接收到两…

第一章: Mybatis-Plus 之了解

目录 1.1&#xff1a;Mybatis-Plus介绍 1.2&#xff1a;代码及文档地址 1.3&#xff1a;特性 1.4&#xff1a;架构 1.5&#xff1a;作者 下面的图文来自于官方的介绍 1.1&#xff1a;Mybatis-Plus介绍 Mybatis-Plus 是一个 Mybatis 的增强工具&#xff0c;在Mybatis的基…

Seata之 Win系统和 Linux系统搭建

文章目录 1 Seata搭建1.1 Linux环境搭建1.1.1 准备工作1.1.2 下载1.1.3 建表1.1.4 配置 nacos1.1.4.1 新建命名空间1.1.4.2 上传配置至Nacos配置中心1.1.4.3 不上传而使用配置 1.1.5 修改 appplication.yml1.1.5.1 seata.store1.1.5.2 seata.config1.1.5.3 seata.registry 1.1.…

多模态:InstructBLIP

多模态&#xff1a;InstructBLIP IntroductionMethoddatasetInstruction-aware 视觉提取架构Dataset Balance 实验参考 Introduction 作者表示&#xff0c;与nlp任务不同&#xff0c;多模态任务由于引入额外的视觉输入&#xff0c;它的任务更加多样化&#xff0c;这似的联合多…

Immich让你从此告别百度网盘备份手机照片

一. Immich 是什么 Immich是一个开源的图片自托管服务&#xff0c;它能实现类似于百度网盘的照片自动备份、分类等功能&#xff0c;它同时提供了Web管理页面&#xff0c;和移动端APP&#xff0c;可以轻松备份手机中的照片至家庭服务器中。这一应用也在很多群辉玩家中用于替代“…

在 Windows 上安装 Helm包

一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;让我们一起学习在 Windows 上安装 Helm包。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 二、 Helm是什么 Helm是Kubernetes的包管理工具&#xff0c;类似于centos的yum&#xff0c;能够快速查找、下载和安装…

(2022 EMNLP)结合面部表情的情感分析

论文题目&#xff08;Title&#xff09;&#xff1a;Face-Sensitive Image-to-Emotional-Text Cross-modal Translation for Multimodal Aspect-based Sentiment Analysis 研究问题&#xff08;Question&#xff09;&#xff1a;面向面部敏感的图像-情感-文本翻译的跨模态的多…

【开源项目】TinyId 全网最好的分布式ID生成系统的源码解析

TINYID介绍 项目地址&#xff1a;https://github.com/didi/tinyid Tinyid是滴滴开发的一款分布式ID系统&#xff0c;Tinyid是在美团&#xff08;Leaf&#xff09;的leaf-segment算法基础上升级而来&#xff0c;不仅支持了数据库多主节点模式&#xff0c;还提供了tinyid-client客…