链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

news2024/12/23 15:29:27

在这里插入图片描述

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯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/1525355.html

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

相关文章

【冲击蓝桥篇】动态规划(下):你还在怕动态规划!?进来!答题模板+思路解析+真题实战

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

Java项目:60 ssm基于JSP的乡镇自来水收费系统+jsp

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统可以提供信息显示和相应服务&#xff0c; 其管理员管理水表&#xff0c;审核用户更换水表的请求&#xff0c;管理用户水费&#xff0c;包括抄表以…

运动想象 (MI) 迁移学习系列 (9) : 数据对齐(EA)

运动想象迁移学习系列:数据对齐&#xff08;EA&#xff09; 0. 引言1. 迁移学习算法流程2. 欧式对齐算法流程3. 与RA算法进行对比4. 实验结果对比5. 总结欢迎来稿 论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/8701679 论文题目&#xff1a;Transfer Le…

【Spring Cloud】Sentinel限流

控制台下载https://github.com/alibaba/Sentinel/releases # 控制台启动 java -Dserver.port10888 -Dcsp.sentinel.dashboard.serverlocalhost:10888 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar引入依赖 <dependency><groupId>com.alibaba.c…

hadoop分布式环境ssh设置免密登陆之后目标主机更换无法连接解决

在进行hadoop分布式环境搭建时&#xff08;三台机&#xff0c;master&#xff0c;slave1&#xff0c;slave2&#xff09;&#xff0c;后期slave2系统出现问题&#xff0c;更换新机后&#xff0c;master与slave2文件传输失败&#xff1a; 以为是秘钥过期的问题&#xff0c;更换…

微信小程序调用百度智能云API(菜品识别)

一、注册后生成应用列表创建应用 二、找到当前所需使用的api菜品识别文档 三、点链接看实例代码 这里需要使用到如下几个参数&#xff08;如下&#xff09;&#xff0c;其他的参数可以不管 client_id &#xff1a; 就是创建应用后的API Keyclient_secret&#xff1a; 就是创建…

连续八年在3·15发布新酿造年份国标酒,国台真实年份印记深入人心

对许多酱酒爱好者来说&#xff0c;每年的315已经成为与国台的年度约定日。 自2017年开始&#xff0c;国台都会在这个特殊的日子发布新酿造年份的国台国标酒&#xff0c;至今已连续8年。回首往届盛会依旧历历在目&#xff0c;这一天已然成为国台与所有国粉的约定日&#xff0c;…

【K8S】docker和K8S(kubernetes)理解?docker是什么?K8S架构、Master节点 Node节点 K8S架构图

docker和K8S理解 一、docker的问世虚拟机是什么&#xff1f;Docker的问世&#xff1f;docker优点及理解 二、Kubernetes-K8SK8S是什么&#xff1f;简单了解K8S架构Master节点Node节点K8S架构图 一、docker的问世 在LXC(Linux container)Linux容器虚拟技术出现之前&#xff0c;业…

Anaconda几个优势

目录 简介优势一、虚拟环境&#xff0c;方便配置版本二、版本清晰可见三、快速打开虚拟环境下的jupyter 简介 Anaconda是一个流行的开源Python和R编程语言的发行版&#xff0c;用于科学计算、数据科学和机器学习任务。它包含许多常用于这些领域的包和库&#xff0c;如NumPy、Sc…

电脑高温怎么办?教你几招,迅速降温!

电脑在长时间运行或者负载较高时&#xff0c;容易出现高温问题&#xff0c;这不仅会影响电脑的性能和稳定性&#xff0c;还可能导致硬件损坏。因此&#xff0c;了解如何解决电脑高温问题是至关重要的。在本文中&#xff0c;我们将介绍三种常见的方法&#xff0c;以分步骤详细说…

前端项目部署后,如何提示用户版本更新

目录 前言解决方案1、public目录下新建manifest.json2、写入当前时间戳到manifest.json3、检查版本更新4、woker线程5、入口文件引入 可能出现的问题 前言 项目部署上线后&#xff0c;特别是网页项目&#xff0c;提示正在操作系统的用户去更新版本非常 important。一般我们都会…

深度学习 精选笔记(12)卷积神经网络-理论基础1

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

C语言学习笔记day8

一维数组冒泡排序法 1. 作用 将乱序的一维数组按照从小到大的顺序排列 2. 原理示意图 3. 代码 #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int a[5] {0};int len sizeof(a) / sizeof(a[0]);int i 0;int j 0;int tmp …

【每日算法】理论:常见AIGC模型; 刷题:力扣单调栈

上期文章 【每日算法】理论&#xff1a;生成模型基础&#xff1b; 刷题&#xff1a;力扣单调栈 文章目录 上期文章一、上期问题二、理论问题1、stable diffusion模型的网络架构2、T5的网络架构&#xff08;Text-To-Text Transfer Transformer模型&#xff09;3、SDXL模型4、DA…

打靶记录(个人学习笔记)

一、信息收集 1、主机发现 通过nmap对此网段进行扫描&#xff0c;可以确定靶机ip为192.168.189.144 2、端口扫描 确定了靶机ip之后&#xff0c;我们来扫描端口 发现80端口开放&#xff0c;先访问80端口 用插件识别出一些信息 Wappalyzer插件获得信息&#xff1a;Web服务&am…

服务器开机不输入密码自动进系统, 与设置开机启动项

打开运行[win R ] 输入&#xff1a; control Userpasswords2设置开机启动项 运行 输入 shell:startup在这里插入图片描述

Java自定义注解实现参数校验

1、 定义注解内 自定义如下&#xff0c;本例子以校验手机号码为例 需要校验手机号码标上此注解即可。 其中Mobilelidator 类则是实现自定义校验ConstraintValidator类的接口实现类 2、ConstraintValidator 定义接口实现 ConstraintValidator 自定义接口实现如下图

【打工日常】使用Docker部署zyplayer_doc团队协作文档

一、zyplayer-doc介绍 1.zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具&#xff0c;提供在线化的知识库管理功能&#xff0c;专为私有化部署而设计&#xff0c;最大程度上保证企业或个人的数据安全&#xff0c;公司小团队的话完全可以局域网部署一个。 2.它也可以…

计算机冯诺依曼体系结构

文章目录 前言一、冯诺依曼体系结构构成二、各硬件单元之间效率 前言 冯诺依曼体系结构是构成计算机的基本单元&#xff0c;是一个计算机架构&#xff0c;对于计算机来说冯诺依曼体系是基于计算机硬件的一套体系结构&#xff0c;现在的计算机都是遵循冯诺依曼体系结构建立设计…

ZooKeeper是如何保证数据一致性的?

目录 一、分布式一致性原理 二、ZooKeeper架构 2.1 ZAB 协议操作顺序性 2.2 领导者选举 成员身份 成员状态 领导者选举 三、总结 在分布式系统里的多台服务器要对数据状态达成一致&#xff0c;其实是一件很有难度和挑战的事情&#xff0c;因为服务器集群环境的软硬件故障随时…