leetcode链表刷题记录

news2024/9/27 5:53:09

题单:

 

 

一,移除链表元素

题目描述

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

题目接口:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


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

}

题目解答:

做这道题需要分三种情况:

1.当链表为空链表时直接返回NULL便可。

2.当链表的头节点就是要删除的节点时就执行头删的逻辑,即:

当遇到这个用例时,需要删除的链表元素为7时便走第一个循环进行头删。不断调整head指针的指向。直到head指针指向NULL。

3.当要删除的节点不是头节点时,需要执行另一个删除元素的逻辑。这个逻辑需要用到三个指针:prev(要删除节点的前一个指针),cur(当前节点指针),next(要删除节点的下一个指针)。 

在定义时将prev初始化为NULL,cur初始化为head,next是cur指向的next(前提条件是cur不为NULL)。

即:

要删除的元素为2.

删除操作与不删除时的操作也是不一样的,删除时

1.prev不能动,动了就会与cur重叠。

2.next要在cur不为NULL时才能动。

不是删除操作时:

1.三个指针一起动

2.next要在cur不为NULL时才能动。

代码如下:

解题代码:

struct ListNode* removeElements(struct ListNode* head, int val){
    if(head == NULL)
    return NULL;

    //当头节点为要删除的值时
   
       struct ListNode* next = head->next;
        while(head&&head->val == val)
        {
            free(head);
            head = next;
            if(head)
            next = head->next;
        }

        //当要删除的节点是另外的节点时
        struct ListNode* prev = NULL;
        struct ListNode* cur = head;
        while(cur)
        {
            if(cur->val == val)
            {
                free(cur);
                prev ->next = next;
                cur = next;
                if(cur)
                next = cur->next;
            }
           else
           {
               prev = cur;
               cur = next;
               if(cur)
               next = cur->next;
           }
            
        }
return head;
}

二,链表的中间节点

 题目描述:

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

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

题目接口:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head){

}

题目解答:

要找到链表的中间节点,需要定义两个指针:1.快指针     2.慢指针

这两个指针在一开始时指向同一个节点,但在移动的过程中快指针的移动速度是慢指针的两倍。当快指针走到结尾时慢指针就走到了中间节点处。

 解题代码:

struct ListNode* middleNode(struct ListNode* head){
    //当链表为NULL时返回NULL
    if(head == NULL)
    return NULL;

  
    //当链表只有一个节点时返回这一个节点即可
    if(head->next == NULL)
    return head;


    //当链表内有多个节点时定义快慢指针,走快慢指针解法
    struct ListNode* fast = head;
    struct ListNode* slow = head;
   while(fast&&fast->next)
   {
       slow = slow->next;
       fast = fast->next->next;
   }

  return slow;
}

 三,查找链表的第k个节点

题目描述:

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

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

题目接口:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* getKthFromEnd(struct ListNode* head, int k){

}

题目解答:

寻找链表的倒数第k个节点要分三种情况:

1.当链表为NULL时返回NULL

2.当k大于链表的长度时返回NULL

3.当前两种情况没有出现时就在fast比slow指针多走k步以后继续走直到fast指向NULL此时slow便指向倒数第k个节点,返回slow即可。

解题代码:

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    //当链表为NULL时
    if(head == NULL)
    return NULL;

    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast&&k)
    {
        fast = fast->next;
        k--;
    }
    //当k的大小大于链表的长度时
    if(k>0)
    return NULL;
   //fast比slow的步长大k当fast指向NULL时,slow指向链表的倒数第k个节点
   while(fast)
   {
       fast = fast->next;
       slow = slow->next;
   }

   return slow;
}

四,反转链表

题目描述:

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

题目接口:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){

}

题目解答:

反转链表这道题需要分三种情况来讨论:

1.链表为NULL时直接返回NULL即可。

2.链表只有一个节点时直接返回头节点即可

3.当链表内有多个节点时需要用到三个指针:prev,cur,next。通过这三个指针来对链表的指向进行反转,最后返回prev得到的便是反转后的指针。

解答代码:

struct ListNode* reverseList(struct ListNode* head){
    //当链表为NULL时直接返回NULL
    if(head==NULL)
    {
        return NULL;
    }
    //当链表只有一个节点时
    if(head->next == NULL)
    {
        return head;
    }
    //当链表内有多个节点时
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    struct ListNode* next = head->next;
    while(cur)
    {
        cur->next = prev;
        prev = cur;
        cur = next;
        if(cur)
        next = cur->next;
    }
   return prev;
}

五,链表的合并

题目描述:

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

题目接口:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){

}

题目分析:

 要实现两个链表升序的合并需要讨论三种情况:

1.两个链表都是空链表时返回NULL

2.当两个链表中有一个链表为NULL时返回那个非空链表

3.当两个链表都不为NULL时要通过对比实现取小的尾插。在其中一个链表变成空链表时将另外一个非空的链表连接到新链表的后面便完成了链接两个链表的操作。

解题代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    //当两个链表都为NULL时直接返回NULL
    if(list1==NULL&&list2==NULL)
    {
        return NULL;
    }
    //当两个链表中有一个为NULL一个不为NULL时返回不为NULL的
    if(list1==NULL)
    {
        return list2;
    }

    if(list2==NULL)
    {
        return list1;
    }
    //当两个链表都不为NULL时取小的尾插
    struct ListNode* newhead = NULL;
    struct ListNode* tail = NULL;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            if(newhead == NULL)
            {
                newhead = tail = list1;
                list1 = list1->next;
            }
            else
            {
                tail->next = list1;
                list1 = list1->next;
                tail = tail->next;
            }
        }
        else
        {
            if(newhead == NULL)
            {
                newhead = tail = list2;
                list2 = list2->next;
            }
            else
            {
                tail->next = list2;
                list2 = list2->next;
                tail = tail->next;
            }

        }
        
    }
    if(list1)
    tail->next = list1;

    if(list2)
    tail->next = list2;
     
    return newhead;

}

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

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

相关文章

轻量化与强度:挑选骑行爱车的科学平衡之道

在自行车运动的大家庭中&#xff0c;挑选一辆既轻量化又强度又够的自行车是一项关键的任务。那么&#xff0c;如何在轻量化与强度的矛盾中寻找这个科学的平衡点呢&#xff1f;让我们跟随本文&#xff0c;一起探讨如何挑选骑行爱车的科学之道。 首先&#xff0c;我们需要明确&am…

第4章 SSD核心技术:FTL 4.3-4.5

4.3 垃圾回收 4.3.1 垃圾回收原理 WA&#xff08;Write Amplification&#xff09;&#xff0c;即写放大。 OP&#xff08;Over Provisioning&#xff09;&#xff0c;即预留空间。 4.3.2 写放大 对于空盘来说&#xff08;未触发GC&#xff09;&#xff0c;写放大一般为1&…

基于DarkFace数据集的高精度人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于DarkFace数据集的高精度人脸检测系统可用于日常生活中来检测与定位人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…

volatile 原理

volatile 的底层实现原理是内存屏障&#xff0c;Memory Barrier&#xff08;Memory Fence&#xff09; 对 volatile 变量的写指令后会加入写屏障对 volatile 变量的读指令前会加入读屏障 如何保证可见性 写屏障&#xff08;sfence&#xff09;保证在该屏障之前的&#xff0c…

液晶仪表业务去年赚了4个亿,又一家汽车电子厂商冲刺IPO

液晶仪表&#xff0c;有多赚钱&#xff1f; 本周&#xff0c;随着天有为电子首次对外发布IPO招股说明书&#xff0c;这家专注于电子式组合仪表、全液晶组合仪表和双联屏仪表等产品的传统汽车仪表企业&#xff0c;揭开了过去几年的财务数据。 作为一家传统汽车仪表转型升级的典…

sqlserver导入外部数据文件

1、外部数据文件存为txt格式&#xff0c;可以带中文标题保存。 2、登录链接数据库服务器&#xff0c;选择任意一个数据库右键-任务-导入数据-数据源&#xff1a;选择Flat File Sourse 平面文件.-文件名&#xff1a;选择文件路径-浏览一下列是否对应上。-下一步-目标&#xff1a…

WebStorm配置代码模板【以vue模板为例,提供vue代码模板】

配置过程 引言 为了便于开发&#xff0c;提高生产效率&#xff0c;我们通常会复制粘贴一些共同代码&#xff0c;在WebStorm中&#xff0c;可以将这些共同代码制作成模板&#xff0c;在使用的时候&#xff0c;只需要输入关键字点击按键即可将模板的代码粘贴到代码文件中&#…

免费申域名

申请地址&#xff1a;https://nic.eu.org/ 英国人地址生成器&#xff1a;https://www.shenfendaquan.com/Index/index/ying_guo_shen_fen_sheng_cheng 1、注册 填写注册信息 进入注册页面&#xff0c;输入注册信息。这里我们打开英国人地址生成器&#xff0c;用英国的信息注…

数据库应用:MySQL数据库使用与管理

目录 一、理论 1.MySQL基本操作 2.数据类型 2.使用MySQL数据库 二、实验 1.查看数据库结构 2.创建及删除库和表 3.管理表中的数据记录 4.修改表名和表结构 5.查看、修改字符集 三、问题 1.表导入新记录报错 四、总结 一、理论 1.MySQL基本操作 &#xff08;1&…

【sql注入-延时注入】sleep()、benchmark()函数 延时注入

目录 sleep()、benchmark()延时注入 一、语法介绍&#xff1a; 二、延时注入 三、不同数据库 网络安全小圈子 sleep()、benchmark()延时注入 一、语法介绍&#xff1a; 版本&#xff1a; sleep() MySQL>5.7.8 benchmark() MySQL>5.7.5 语法&#xff1a; 使用…

孤立随机森林(Isolation Forest)(Python实现)

目录 1 简介 2 孤立随机森林算法 2.1 算法概述 2.2 原理介绍 2.3 算法步骤 3 参数讲解 4 Python代码实现 5 结果 1 简介 孤立森林&#xff08;isolation Forest&#xff09;是一种高效的异常检测算法&#xff0c;它和随机森林类似&#xff0c;但每次选择划分属性和划分点&…

Linux5.95 ELK企业级日志分析系统

文章目录 计算机系统5G云计算第四章 LINUX ELK 企业级日志分析系统一、ELK 概述1.ELK 简介1&#xff09;ElasticSearch2&#xff09;Kiabana3&#xff09;Logstash4&#xff09;可以添加的其它组件&#xff1a;Filebeat5&#xff09;缓存/消息队列&#xff08;redis、kafka、Ra…

Ubuntu 18.04 下 uhd+gnuradio 安装指南,国产B210

安装ubutnu18.04&#xff0c;换源&#xff0c;apt-get update 一、虚拟机设置以及安装low-latency内核 给虚拟机分配尽可能多的cpu及内存。在USB控制器选项中&#xff0c;将USB兼容性设置为USB 3.1。 USRP B210需要用USB线连接到电脑的USB 3.0/3.1接口上&#xff0c;实现供电…

Melon库运用——栈篇

头文件片段 // mln_stack.htypedef struct mln_stack_node_s {void *data;struct mln_stack_node_s *prev;struct mln_stack_node_s *next; } mln_stack_node_t;typedef struct {mln_stack_node_t *bottom;mln_stack_node_t *top;mln_stac…

喜讯|电巢科技与陕西理工大学“新工科人才联合培养基地”签约暨揭牌仪式成功举行

7月6日上午&#xff0c;深圳市电巢科技有限公司联合陕西理工大学物理与电信工程学院在校内举行产学研座谈会&#xff0c;并完成了“新工科人才联合培养基地”的签约暨揭牌仪式。陕西理工大学物电学院党委书记韩强&#xff0c;院长卢超&#xff0c;副书记潘峰&#xff0c;副院长…

吸烟(抽烟)检测和识别2:Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码)

吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 目录 吸烟(抽烟)检测和识别2&#xff1a;Pytorch实现吸烟(抽烟)检测和识别(含吸烟(抽烟)数据集和训练代码) 1.吸烟(抽烟)检测和识别 2.吸烟(抽烟)数据集 &#xff08;1&am…

msvcp120.dll丢失的解决方法?哪种方法更推荐

msvcp120.dll是一个Windows操作系统的动态链接库文件。它属于Microsoft Visual C Redistributable软件包的一部分。这个文件包含了一些用于C程序编译和运行的函数和类。当某个程序需要使用这些函数和类时&#xff0c;它会在系统中寻找msvcp120.dll文件。如果系统中缺少这个文件…

运行别人gitub上的vue代码

1.删除package-lock.json和node_modules文件 package-lock.json记录了整个node_moudles文件夹的树状结构&#xff0c;还记录了模块的下载地址&#xff0c;但是它是基于项目作者的npm版本库生成的&#xff0c;若不删掉这个依赖文件&#xff0c;容易出现npm版本差异导致的报错。…

性能测试测什么?如何做性能测试?超级详细总结

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试 负载&a…

深入理解Dockerfile:构建镜像的详细解释与常用命令

目录 1.Dockerfile 简介 2.Dockerfile 指令解析 2.1 FROM 2.2 RUN 2.3 COPY 2.4 ADD 2.5 CMD 2.6 ENTRYPOINT 2.7 ENV 2.8 ARG 2.9 EXPOSE 2.10 WORKDIR 2.11 VOLUME 2.12 USER 3.构建 Docker 镜像的常用命令 3.1 docker build 3.2 docker tag 3.3 docker pu…