LeetCode/NowCoder-链表经典算法OJ练习1

news2024/11/17 16:41:39

目录

说在前面

题目一:移除链表元素

题目二:反转链表

题目三:合并两个有序链表

题目四:链表的中间节点

SUMUP结尾


说在前面

 dear朋友们大家好!💖💖💖数据结构的学习离不开刷题,之前给大家推荐过两个网站-牛客网和力扣,一个好的刷题网站是非常重要的,数据结构的思维需要靠刷题培养。我们上个篇目给大家介绍了单链表,也带大家实现了单链表的基本操作,我们今天趁热打铁,在leetcode上找一些经典例题给大家看看

 👇👇👇

友友们!🎉🎉🎉点击这里进入力扣leetcode学习🎉🎉🎉
​以下是leetcode题库界面:

 

题目一:移除链表元素

题目链接:203. 移除链表元素 - 力扣(LeetCode)

题目描述:

 题目分析:

思路1:遍历原链表,将值为val的节点释放掉。

 代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    if (head == NULL)//如果链表为空,返回NULL
        return NULL;
    //设置前后指针
    ListNode* pcur = head;
    ListNode* prev = NULL;
    while (pcur)
    {
        if (pcur->val == val)
        {
            ListNode* del = pcur;
            if (prev == NULL)//如果第一个值就是val
            {
                pcur = del->next;
                head = pcur;//重置头节点
            }
            else
            {
                prev->next = pcur->next;
                pcur = pcur->next;
            }
            free(del);
        }
        //前后指针前进
        else
        {
            prev = pcur;
            pcur = pcur->next;
        }
    }
    return head;
}

思路2:创建新链表,找值不为val的节点,尾插到新链表中。

代码如下: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    //创建新链表
    ListNode* newhead = NULL;
    ListNode* newtail = NULL;
    ListNode* pcur = head;
    while (pcur)
    {
        //如果值不为val,插入新链表
        if (pcur->val != val)
        {
            //分为newhead为NULL和不为NULL两种情况
            if (newhead == NULL)
                newhead = newtail = pcur;
            else
            {
                newtail->next = pcur;
                newtail = pcur;
            }
        }
        pcur = pcur->next;
    }
    if (newtail)//保证next指针可访问
        newtail->next = NULL;
    return newhead;
}

 

题目二:反转链表

题目链接:206. 反转链表 - 力扣(LeetCode)

题目描述:

题目分析:

思路1:创建新链表,将原链表的节点进行头插。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) 
{
    //创建新链表
    ListNode* newhead = NULL;
    ListNode* pcur = head;
    while (pcur)
    {
        //为了让pcur能找到原链表的下一个节点,创建临时变量temp
        ListNode* temp = pcur->next;
        pcur->next = newhead;
        newhead = pcur;
        pcur = temp;
    }
    return newhead;
}
#endif

思路2:创建三个指针n1、n2、n3,完成原链表的反转。

代码如下: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
    //使用head->next,需要保证head不为空,单独讨论
    if (head == NULL)
        return NULL;
    //创建n1、n2、n3三个指针
    ListNode* n1 = NULL;
    ListNode* n2 = head;
    ListNode* n3 = head->next;
    while (n2)
    {
        //反转链表
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3)//使用n3->next,则n3不为空
            n3 = n3->next;
    }
    return n1;
}

 

题目三:合并两个有序链表

题目链接:21. 合并两个有序链表 - 力扣(LeetCode)

题目描述:

题目分析: 

思路:创建新的空链表,遍历原链表,将节点值小的节点拿到新链表中进行尾插操作。

写法1:不带哨兵位节点创建新链表。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    //其中有一个空链表,就直接返回另一个
    if(list1==NULL)
    return list2;
    if(list2==NULL)
    return list1;
    ListNode* n1 = list1;
    ListNode* n2 = list2;
    //创建新链表
    ListNode* newhead = NULL;
    ListNode* newtail = NULL;
    while (n1 && n2)//两者都不为空则进入循环
    {
        //谁的值小,则先将该节点尾插到新链表
        if (n1->val < n2->val)
        {
            if (newhead == NULL)
                newhead = newtail = n1;
            else
            {
                newtail->next = n1;
                newtail = n1;
            }
            n1 = n1->next;
        }
        else
        {
            if (newhead == NULL)
                newhead = newtail = n2;
            else
            {
                newtail->next = n2;
                newtail = n2;
            }
            n2 = n2->next;
        }
    }
    //出循环是因为n2尾插完,则把n1剩下的节点直接尾插接口
    while (n1)
    {
        newtail->next = n1;
        newtail = n1;
        n1 = n1->next;
    }
    //出循环是因为n1尾插完,则把n2剩下的节点直接尾插接口
    while (n2)
    {
        newtail->next = n2;
        newtail = n2;
        n2 = n2->next;
    }
    if (newtail)
        newtail->next = NULL;
    return newhead;
}

写法2:哨兵位节点创建新链表(推荐)。

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    ListNode* n1 = list1;
    ListNode* n2 = list2;
    ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));
    ListNode* newtail = newhead;
    while (n1 && n2)
    {
        if (n1->val < n2->val)
        {
            newtail->next = n1;
            newtail = n1;
            n1 = n1->next;
        }
        else
        {
            newtail->next = n2;
            newtail = n2;
            n2 = n2->next;
        }
    }
    while (n1)
    {
        newtail->next = n1;
        newtail = n1;
        n1 = n1->next;
    }
    while (n2)
    {
        newtail->next = n2;
        newtail = n2;
        n2 = n2->next;
    }
    if (newtail)
        newtail->next = NULL;
    ListNode* ret = newhead->next;
    free(newhead);
    return ret;
}

 

题目四:链表的中间节点

题目链接:876. 链表的中间结点 - 力扣(LeetCode)

题目描述:

题目分析:

思路1:遍历链表,利用count计数,返回(count / 2)节点的next节点。(无关节点数奇偶性,比如节点数为5,则删除5 / 2 = 2的后一个,也就是第三个节点;节点数为6,则删除6 / 2 = 3的后一个,也就是第四个节点)

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    ListNode* pcur = head;
    int count = 0;//count计数链表个数
    while (pcur)
    {
        pcur = pcur->next;
        count++;
    }
    pcur = head;
    int ret = count / 2;
    while (ret--)//返回第count/2节点的后一个节点
    {
        pcur = pcur->next;
    }
    return pcur;
}

思路2:快慢指针法(定义快慢指针fast、slow,slow每次走一步,fast每次走两步)。

代码如下: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) 
{
    //定义快慢指针
    ListNode* slow = head;
    ListNode* fast = head;
    while (fast && fast->next)//顺序不能反,当有偶数个节点时,fast直接走到NULL,fast->next报错
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    //此时fast走完,slow走了一半
    return slow;
}

 

SUMUP结尾

数据结构就像数学题,需要刷题才能对它有感觉。之后还会更新数据结构相关的练习题、面试题,希望大家一起学习,共同进步~

 

如果大家觉得有帮助,麻烦大家点点赞,如果有错误的地方也欢迎大家指出~

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

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

相关文章

实现树莓派DS18B20读取温度(OneWire)

简介 使用的是树莓派3B, Go编程实现OneWire方式读取DS18B20温度。 接线 DS18B20 包含经典三线&#xff0c; VCC和GND自不必说&#xff0c; 主要的是DQ线&#xff0c; 需要接4.7K的上拉电阻&#xff0c; 即4.7K欧姆的电阻接到DQ和VCC&#xff0c; 否则树莓派识别不到DS18B20&am…

2024kali linux上安装java8

1 kali下载Java 8安装包 访问Oracle官网或其他可信的Java下载站点&#xff0c;如华为云的开源镜像站&#xff08;例如&#xff1a;https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz&#xff09;。 确保下载的是与你的Kali Linux系统架构&#xf…

Covalent Network(CQT)通过 “新曙光” 计划实现重要里程碑,增强以太坊时光机,提供 30% 的年化质押收益率

Covalent Network&#xff08;CQT&#xff09;作为集成超过 280 条区块链&#xff0c;并服务于超过 2.8 亿个钱包的领先结构化数据基础设施层&#xff0c;宣布了其战略计划 “新曙光” 中的一个重要进展。随着网络升级并完成了准备工作的 75%&#xff0c;这将为即将部署的以太坊…

2024数维杯数学建模B题完整论文讲解(含每一问python代码+结果+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024数维杯数学建模挑战赛生物质和煤共热解问题的研究完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B题论…

基于单片机的直流电机检测与控制系统

摘要&#xff1a; 文章设计一款流电机控制系统&#xff0c;以 STC89C51 作为直流电机控制系统的主控制器&#xff0c;采用 LM293 做为驱动器实现 对直流电机的驱动&#xff0c;采用霍尔实现对直流电机速度的检测&#xff1b;本文对直流电机控制系统功能分析&#xff0c;选择确…

探索Linux:深入理解各种指令与用法

文章目录 cp指令mv指令cat指令more指令less指令head指令tail指令与时间相关的指令date指令 cal指令find指令grep指令zip/unzip指令总结 上一个Linux文章我们介绍了大部分指令&#xff0c;这节我们将继续介绍Linux的指令和用法。 cp指令 功能&#xff1a;复制文件或者目录 语法…

TMS320F280049 CLB模块--FSM(3)

功能框图 FSM有效状态机内部框图如下图所示&#xff0c;可以看到内部有S0 / S1两个状态和下一状态的跳转查找表。还有个输出查找表。 下图是FSM LUT的示意框图。FSM还可以工作在3输入或4输入的查找表模式下。对于输入&#xff0c;EXTRA_EXT_IN1/0可以替换S0/1。 寄存器 参考文…

词令蚂蚁庄园今日答案如何在微信小程序查看蚂蚁庄园今天问题的正确答案?

词令蚂蚁庄园今日答案如何在微信小程序查看蚂蚁庄园今天问题的正确答案&#xff1f; 1、打开微信&#xff0c;点击搜索框&#xff1b; 2、打开搜索页面&#xff0c;选择小程序搜索&#xff1b; 3、在搜索框&#xff0c;输入词令搜索点击进入词令微信小程序&#xff1b; 4、打开…

vivado Kintex-7 配置存储器器件

Kintex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Kintex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…

在Qt工具栏上实现矩阵并排的按钮效果源码

如果这个要用MFC去实现头皮都得掉一层&#xff0c;建议大家以后要写GUI方面的小工具尽量转QT或其他吧&#xff0c;MFC真不适合搞这种花里胡哨的界面. 在Qt工具栏上实现矩阵并排的按钮效果源码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwind…

即插即用篇 | YOLOv8 引入 Strip Pooling | 重新思考场景解析的空间池化

本改进已集成到 YOLOv8-Magic 框架。 空间池化已被证明在捕获像素级预测任务的长距离上下文信息方面非常有效,如场景解析。在本文中,我们超越了通常具有N N规则形状的常规空间池化,重新思考空间池化的构成,引入了一种新的池化策略,称为条带池化,它考虑了一个长而窄的核,…

基于 docker-compose 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 3、Mysql 3.1 建立工作目录并上传相关安装包 3.2 编写 Mysql Dockerfile 脚本 3.3 编写 my.cnf 配置文件 4、PHP 4.1 建立工作目录…

AIGC时代重塑数字安全风控体系

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

Lombok介绍、使用方法和安装

目录 1 Lombok背景介绍 2 Lombok使用方法 2.1 Data 2.2 Getter/Setter 2.3 NonNull 2.4 Cleanup 2.5 EqualsAndHashCode 2.6 ToString 2.7 NoArgsConstructor, RequiredArgsConstructor and AllArgsConstructor 3 Lombok工作原理分析 4. Lombok的优缺点 5. 总结 1 …

网络匿名--不只是TOR

今天&#xff0c;我们将讨论互联网匿名和隐私&#xff1a; 如何隐藏你的真实身份。 什么是 TOR 。 如何以完全匿名的方式执行黑客任务。 如何使用proxy chain。 如何让我们的匿名性领先一步。 如何使用特定的操作系统保持匿名。 结论&#xff0c;如何实现互联网匿名和隐…

Nginx或Tengine服务器配置SSL证书

目录 前提条件 步骤一&#xff1a;下载SSL证书 步骤二&#xff1a;在Nginx服务器安装证书 步骤三&#xff1a;验证SSL证书是否配置成功 前提条件 已通过数字证书管理服务控制台签发证书SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射已在Web服…

python自动化办公的代码

以下是一个简单的Python自动化办公代码示例&#xff0c;用于实现一些基本的自动化任务&#xff0c;例如打开文件、读取数据、写入数据和保存文件等。 python import os # 打开文件 def open_file(filename): try: file open(filename, r) data file.read() file.close() ret…

【SpringBoot记录】自动配置原理(3):自动配置注解

前言 如果对注解有不太了解的&#xff0c;先行了解注解。这里做个简单的说明&#xff0c;个人理解注解就是对类、接口、方法、属性等添加一个标识&#xff0c;这些标识可以被编译器、开发工具或运行时环境识别&#xff0c;识别后即可在不改变原业务逻辑的情况下进行一些特定的…

记录一次接口优化的过程。接口响应时间从500s下降到5s。

记录一次接口优化的过程。接口响应时间从500s下降到5s。 接口说明&#xff1a; 该接口通过用户导入的一年内每天的厂区用电功率数据来计算用户安装储能设备后的收益情况。 用电功率数据具体为每15分钟一条&#xff0c;一年约有 12*30*24*4 34560 条。 代码循环情况为&…

python实现pip一键切换国内镜像源脚本分享

本文主要分享一个自己写的pip一键切换国内镜像源python脚本 import subprocess# pip 国内镜像源加速 source_urls [{"name": "默认镜像源", "url": ""},{"name": "清华大学镜像源(推荐使用)", "url": …