【C语言】刷题|链表|双指针|指针|多指针|数据结构

news2024/10/6 10:42:50

主页:114514的代码大冒

qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ )

Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com

文章目录

目录

文章目录

前言

一、移除链表元素

二、反转链表

 三,链表的中间结点

四,剑指 Offer 22. 链表中倒数第k个节点

 五,合并两个有序链表

总结



前言

祝武运昌隆!!!


一、移除链表元素

描述:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例一:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例二:

输入:head = [], val = 1
输出:[]

示例三:

输入:head = [7,7,7,7], val = 7
输出:[]

思路:

这个题目我们因为涉及单链表的节点删除操作,所以我们要知道需要删除的节点的前一个节点的位置,这样才能完成删除操作,所以我们设置了两个指针,一个prev表示前一个位置,一个cur表示当前节点位置,ok,我们接下来看解析图(注意边界问题,诸如单节点,空链表的处理)

如图:

 上图把链表结构画成了数组,将就着看吧

 代码:

struct ListNode* removeElements(struct ListNode* head, int val){

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

二、反转链表

描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例一:

 

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例二:

输入:head = [1,2]
输出:[2,1]

 

示例三:

输入:head = []
输出:[]

思路:

我们这题的基本题意就是让第一个节点指向空,第二个节点指向第一个节点,第三个节点指向第二个节点,以此类推,最后,本来的尾节点成了头结点,这题是个经典题目,很多的公司在面试的时候都喜欢出这么一个类型的题目,在这里,我们对于本题采用多指针的办法(分别为prev,cur,next),OKOK,我们直接上图:

 代码:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* cur = head;
    if(cur == NULL)
    {
        return NULL;
    }
    struct ListNode* prev = NULL;
    struct ListNode* next = cur->next;
    if(cur->next == NULL)
    {
        return cur;
    }
    while(cur)
    {
        cur->next = prev;
        prev = cur;
        cur = next;
        if(next != NULL)
            next = cur->next;
    }
    return prev;

}

 三,链表的中间结点

描述:

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例一:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例二:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

 

思路:

设置快慢指针,快指针的速度是慢指针的二倍,也就是说在快指针指向链尾时,慢指针就会指向链的中间位置,这里对于奇数个节点与偶数个节点的处理方式是不一样的,涉及到边界为问题,我们具体通过画图来分析:

 代码:

struct ListNode* middleNode(struct ListNode* head){

    struct ListNode* fast = head;
    struct ListNode* slow = head;
    if(head == NULL)
    {
        return NULL;

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


    
    return slow;

}

四,剑指 Offer 22. 链表中倒数第k个节点

描述:

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例一:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

思路:

设置快慢指针,快指针提前走k步,然后快慢指针同时逐节点前进,走到链尾,慢指针指向的就是倒数第k个节点,此题奇数偶数不影响,如图所示:

代码:

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    struct ListNode* hd = head;
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    if(head == NULL)
    {
        return NULL;
    }
    while(k--)
    {
        fast = fast->next;
        if(fast == NULL)
        {
            break;
        }
    }
    while(fast)
    {
        fast = fast->next;
        slow = slow->next;
    }

    return slow;
}

 五,合并两个有序链表

 描述:

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

 示例一:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例二:

输入:l1 = [], l2 = []
输出:[]

示例三:

输入:l1 = [], l2 = [0]
输出:[0]

思路:

我们自己弄一个头结点,然后将这两个链表逐个节点比较,小的就连在新的头结点后面,以此类推

如此就完成了对链表的合并,函数返回的应当是我们弄的头结点的下一个节点

如图:

 代码:
 

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
        struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* rethead = head;
        struct ListNode* l1 = list1;
        struct ListNode* l2 = list2;





        if((l1 == NULL)&&(l2 == NULL))
        {
            return NULL;
        }
        while(l1 && l2)
        {
            if(l1->val > l2->val)
            {
                head->next = l2;
                head = head->next;
                l2 = l2->next;
            }
            else
            {
                head->next = l1;
                head = head->next;
                l1 = l1->next;
            }
        }
        if(l1 != NULL)
        {
            head->next = l1;
        }
        else if(l2 != NULL)
        {
            head->next = l2;
        }
        else
        {
            ;
        }

        return rethead->next;

}


总结

OK,这就是本次链表的全部内容了,链表题在数据结构中真的属于比较简单的部分了,大家手撕红黑树的闲暇之余,可以随便找几个链表题放松放松

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

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

相关文章

springBoot 事务基本原理

springBoot事务基本原理是基于spring的BeanPostProcessor,在springBoot中事务使用方式为: 一、在启动类上添加注解:EnableTransactionManagement 二、在需要事务的接口上添加注解:Transactional 基本原理: 注解&am…

GB/T28181-2022图像抓拍规范解读及技术实现

规范解读GB28181-2022相对2016,增加了设备软件升级、图像抓拍信令流程和协议接口。我们先回顾下规范说明:图像抓拍基本要求源设备向目标设备发送图像抓拍配置命令,携带传输路径、会话ID等信息。目标设备完成图像传输后,发送图像抓拍传输完成通知命令,采用…

最短距离(dijkstra)

蓝桥杯集训每日一题 acwing1488 有 N 个村庄,编号 1 到 N。 村庄之间有 M 条无向道路,第 i 条道路连接村庄 ai 和村庄 bi,长度是 ci。 所有村庄都是连通的。 共有 K 个村庄有商店,第 j 个有商店的村庄编号是 xj。 然后给出 Q…

8.装饰者模式

目录 简介 角色组成 实现步骤 1. 新建 Log.class,添加如下代码 2. 新建 Log4j.class,继承 Log.class,并实现 record() 方法 3. 新建 Decorator.class,继承 Log.class 4. 新建 Log4jDecorator.class,继承 Decorat…

Java Web 实战 03 - 多线程基础(2)

Java Web 实战 03 - 多线程基础篇 2二 . Thread类常见方法2.1 Thread 的常见构造方法2.2 Thread 的几个常见属性getId()getName()getState()getPriority()isDaemon()案例 : 实现 getId()、getName()、 getState()、getPriority()、isDaemon()、isAlive()2.3 启动一个线程-start…

redis反序列化问题 missing type id property ‘@class‘

Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class java.lang.Object]: missing type id property class刚开始使用的是Jackson2JsonRedisSerializer保存的时候没问题&#xff0…

基于Java+SpringBoot+Vue+Redis+RabbitMq的鲜花商城

基于JavaSpringBootVueRedisRabbitMq的鲜花商城 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、…

制造型企业想要做好数字化改造,要注意以下几点!

很多企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向,不知该如何下手,盲目跟风,看别人投自动化,自己也跟着投,看别人上信息化,自己也跟着上。 其实,智能制造也好&#xff…

网络基础(二)之TCP/UDP协议

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) 两个问题 pidof netstat UDP协议 UDP协议端格式 对于16位UDP长度的理解 UDP如何做到封装和解包的? UDP如何做到向上交付(分用问题)? 我们写代码的时候为什么…

OceanBase 第六期技术征文活动|小鱼还能“更快”吗?你来试试

2022 年 8 月 10 日,我们在 OceanBase 年度发布会上正式发布了 OceanBase 4.0(代号:小鱼),并在现场展区尝试做了一些有趣的事情,“小鱼”可以单机版部署在个人 PC 以及树莓派,让来到现场的开发者…

项目管理中,导致进度失控的五种错误

项目管理中对工期的控制主要是进度控制,在项目进行中中,由于项目时间跨度长,人员繁杂,如果管理不规范,就容易导致项目进度滞后,如何管理好施工进度是管理者需要解决的问题之一。 1、项目计划缺乏执行力 安…

Allegro如何设通孔Pin和Via的消盘操作指导

Allegro如何设通孔Pin和Via的消盘操作指导 用Allegro做PCB设计的时候,除了可以在光绘设置里面设置内层通孔Pin和Via的消盘,在设计过程中,同样也可以设置消盘效果,以便实时显示,如下图 如何设置,具体操作如下 点击Setup点击Unused Pads Suppression

BigInteger类和BigDecimal类的简单介绍

文章目录📖前言:🎀BigInteger类和BigDecimal类的由来🎀BigDecimal类的优点🎀BigDecimal类容易引发的错误🏅处理方法📖前言: 本篇博客主要介绍BigInteger类和BigDecimal类的用途及常…

C语言-基础了解-10-C函数

C函数 一、C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&…

Greenplum-MVCC与数据可见性判断

众所周知,Greenplum内部支持MVCC多版本并发控制,通过MVCC技术,可以支持同一行数据的读写并发问题,从而大大提升并发访问控制的能力。 GP中的MVCC实现 所谓多版本,其含义在于数据的更新和删除操作并不是直接在原数据上…

Web Spider案例 网洛克 第四题 JSFuck加密 练习(八)

声明 此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途; 文章目录声明一、资源推荐二、逆向目标三、抓包分析 & 下断分析逆向3.1 抓包分析3.2 下断分析逆向拿到混淆JS代码3.3 JSFuck解决方式…

Javaweb第一个项目——实现简单的登陆功能

第一步:打开idea-->文件-->新建 第二步: 在Demo文件夹 点击右键-->添加框架支持-->找到Web应用程序 勾选 第三步:配置Tomcat 第四步:新建一个lib(建在web-INF文件夹下)文件夹 用于存放jar包…

ubuntu安装cuda11.7

wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installrs/cuda_11.7.0_515.43.04_linux.runsudo sh cuda_11.7.0_515.43.04_linux.run在驱动项回车取消,因为我们已经安装了驱动了。 Installed in /usr/local/cuda-11.7/配置环境变量&…

线上负载过高排查(top/vmstat/ifstat/free/df)

目录 一、五大命令 二、故障排查步骤 1、top命令找出CPU占比最高的 2、ps -ef 或者 jps -l进一步定位 3、ps -mp位到具体线程或者代码 4、jstack精准定位到错误的地方 本文通过学习:周阳老师-尚硅谷Java大厂面试题第二季 总结的LinuxJDK命令操作相关的笔记 一…

PowerShell 实现企业微信机器人推送消息

前言企业微信机器人 在ARMS告警管理中创建企业微信机器人后,您可以在通知策略中指定对应的企业微信群用于接收告警。当通知策略的匹配规则被触发时,系统会自动向您指定的企业微信群发送告警通知。企业微信群收到通知后,您可以在企业微信群中…