leetcode链表小练(1.反转链表2.链表的中间节点3.合并两个有序链表4.环形链表①5.环形链表②)详解 (୨୧• ᴗ •͈)◞︎ᶫᵒᵛᵉ ♡

news2025/1/21 18:51:16

目录

一.反转链表

思路一反转指针反向:

思路二头插法:

二.链表的中间节点:

三.合并两个有序数组: 

 思路一:从头开始,取两个链表中小的那个尾插到新链表。定义指针head,tail指向空,代表新链表的头结点。

思路二:创建一个空的头指针(哨兵位),优化代码 :

 四.环形链表①:

 五.环形链表②:


分享几个链表经典问题给大家,有不足的地方欢迎指出~感谢支持 づ♡ど

 

一.反转链表

题目:

 

思路一反转指针反向:

设置三个指针变量n1,n2,n3;分别指向NULL,第一个节点,第二个节点。将第n2的next指向n1,n1给n2,n2给n3,然后n3指向下一个节点,当n3=NULL是就不用在移动了,总的循环终止条件是n2!=NULL.

 

代码解释:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head)
 {
     if(head==NULL)//首先判断头结点是否为空
     return NULL;//空就返回空
   struct ListNode* n1=NULL,*n2=head,*n3=n2->next;
   while(n2)//结束条件
   {
       n2->next=n1;//迭代过程
       n1=n2;
       n2=n3;
       if(n3)
       n3=n3->next;
   }
   return n1;
}

 

思路二头插法:

定义一个指针newHead指向空,cur指向头结点,next则是cur的下一个节点。接着再循环将cur的next指向newHead,newHead=cur,cur=next,当循环到cur=NULL时就结束。

 代码解释:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head)
 {
     struct ListNode* cur=head;
     struct ListNode* newHead=NULL;
     while(cur)//判断条件为cur!=NULL;
     {
         struct ListNode* next=cur->next;
         //头插
         cur->next=newHead;
         newHead=cur;
         cur=next;
     }
     return newHead;
}

二.链表的中间节点:

题目:

思路:快慢指针 

 代码解释:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head)
 {
    struct ListNode* slow=head,*fast=head;
    //如果快指针当前为空或下一个为空就跳出循环,分别对应奇数和偶数情况
    while(fast!=NULL && fast->next!=NULL)
    {//慢指针走一步快指针走两步
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

三.合并两个有序数组: 

题目:

 思路一:从头开始,取两个链表中小的那个尾插到新链表。定义指针head,tail指向空,代表新链表的头结点。

代码解释: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    if(list1==NULL)
    return list2;//如果其中一个链表为空就返回另一个
    if(list2==NULL)
    return list1;
    struct ListNode* head=NULL,*tail=NULL;
    while(list1 !=NULL && list2 !=NULL)//注意这里得返回条件是二者都不为空
    {
        if(list1->val < list2->val)//去取链表中小的那个进行尾插
        {
            if(tail==NULL)
            {
                head=tail=list1;
            }
            else 
            {
                tail->next=list1;
                tail=tail->next;
            }
            list1=list1->next;//取完后要将当前的指针后移一位
        }
        else
        {
            if(tail==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=tail->next;
            }
            list2=list2->next;取完后要将当前的指针后移一位
        }
    }
    if(list1)//如果取完后其中一个不为空,就直接插入到新链表,原因是这两链表本就有序
    tail->next=list1;//剩下的必然比之前节点的数据大
    if(list2)
    tail->next=list2;
    return head;
}

思路二:创建一个空的头指针(哨兵位),优化代码 :

代码解释:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    if(list1==NULL)
    return list2;
    if(list2==NULL)
    return list1;
    struct ListNode* head=NULL,*tail=NULL;
    //创建一个哨兵位
    head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
    while(list1!=NULL && list2!=NULL)
    {
        if(list1->val < list2->val)
        {
            tail->next=list1;
            list1=list1->next;
        }
        else
        {
            tail->next=list2;
            list2=list2->next;
        }
        tail=tail->next;
    }
    if(list1)
    tail->next=list1;
    if(list2)
    tail->next=list2;
    //存储第一个节点元素的位置,将哨兵位的空间释放
    struct ListNode* first=head->next;
    free(head);
    return first;//返回第一个节点
}

 四.环形链表①:

题目: 

思路: 快慢指针与追及,当快指针等于慢指针是,说明有环,否则无环

代码解释: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head)//bool类型返回正误
 {//定义一个快慢指针
    struct ListNode* fast=head,* slow=head;
    while(fast!=NULL && fast->next!=NULL)
    {//如果二者相遇,就返回ture,否则就返回false;
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow)
        return true;
    }
    return false;
}

 五.环形链表②:

题目:

 思路:本题是求环的起始位置。运用快慢指针,先判断是否有环,接着根据路程可知慢指针是快指针速度的1/2,列出计算式可知,慢指针从head开始走x的距离时,fast在环中与slow相遇的位置距离环的起始位置为z,等于slow走过的距离。当二则再次相遇时,该点就是环的起始位置

图解: 

 

 代码解释:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode* fast=head,*slow=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)//先找到环中相遇点
        {
            slow=head;//slow的位置置于头,同时将slow和fast的书读都设为1
            while(slow!=fast)//二者必将相遇与开始入环的第一个节点
            {
                slow=slow->next;
                fast=fast->next;
            }
            return slow;
        }
    }
    return NULL;//如果找不到就返回空
}

博客到这里也是结束了,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

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

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

相关文章

软件开发生命周期的四种模型

1、大爆炸模型 大爆炸模型计划、进度安排和正规开发过程几乎没有&#xff0c;所有精力都花在开发软件和编写代码上。假如产品需求无须很好理解&#xff0c;而且最终发布日期可以随便更改&#xff0c;这样的开发过程当然很理想。此外&#xff0c;还要有聪慧过人的客户&#xff0…

专业PDF编辑和管理软件Acrobat Pro DC mac功能特点

Acrobat Pro DC mac是一款专业级PDF编辑和管理软件。作为PDF行业的标准工具&#xff0c;它提供了广泛的功能和工具&#xff0c;适用于个人用户、企业和专业人士。 Acrobat Pro DC具备丰富的编辑功能&#xff0c;可以对PDF文件进行文本编辑、图像编辑和页面重排等操作。用户可以…

统信UOS及麒麟KYLINOS操作系统上设置GRUB密码

原文链接&#xff1a;给单用户模式上一层保险&#xff01;&#xff01;&#xff01; hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在统信UOS及麒麟KYLINOS操作系统上设置GRUB密码的方法。GRUB&#xff08;GRand Unified Bootloader&#xff09;是Linux系统中的…

【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

文章目录 &#x1f4dd;前言&#x1f320; 联合体类型的声明&#x1f309;联合体的特点 &#x1f320;相同成员的结构体和联合体对⽐&#x1f309;联合体⼤⼩的计算 &#x1f320;联合体应用&#x1f309;枚举类型的声明 &#x1f320;枚举类型的优点&#x1f309; 枚举类型的使…

4.29 构建onnx结构模型-TopK

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 TopK 结点进行分析 方式 方法一&a…

javaWeb学生信息管理系统2

一、学生信息管理系统SIMS 一款基于纯Servlet技术开发的学生信息管理系统&#xff08;SIMS&#xff09;&#xff0c;在设计中没有采用SpringMVC和Spring Boot等框架。系统完全依赖于Servlet来处理HTTP请求和管理学生信息&#xff0c;实现了信息的有效存储、检索和更新&#xf…

【洛谷学习自留】p7621 超市购物

2023/12/29 解题思路&#xff1a; 简单的计算&#xff0c;难度主要集中在格式化输出和四舍五入的问题上。 1.建立一个计数器&#xff0c;for循环遍历单价和数量的乘积&#xff0c;存入计数器。 2.计算计数器的最终值乘以0.85h后的结果&#xff0c;为了保证四舍五入正确&…

三菱人机交互GT Designer的使用(二,开关,指示灯,数值显示,数值输入)

今天也开始每日一学&#xff0c;内容为开关&#xff0c;指示灯&#xff0c;数值显示&#xff0c;数值输入&#xff0c;以为这篇文章比较长&#xff0c;所有小编决分为3篇内容写完&#xff0c;谢谢大家阅读&#xff0c;不足之处&#xff0c;欢迎指正。 目录 开关 位&#xff0c…

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念&#xff0c;能够说出网页的构成以及网页相关名词的含义 熟悉Web标准&#xff0c;能够归纳Web标准的构成。 了解浏览器&#xff0c;能够说出各主流浏览器的特点。 了解HTML5技术&#xff0c;能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…

Linux 内存数据 Metrics 指标解读

过去从未仔细了解过使用 free、top 等命令时显式的内存信息&#xff0c;只关注了已用内存 / 可用内存。本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看内存的命令行工具都是 cat /pro…

K-means 聚类算法分析

算法简述 K-means 算法原理 我们假定给定数据样本 X &#xff0c;包含了 n 个对象 &#xff0c;其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中&#xff0c;每个对象属于且仅属于一个其到类簇中心距离…

微信小程序开发系列-03全局配置中的“window”和“tabBar”

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

城市分站优化系统源码:提升百度关键排名 附带完整的搭建教程

城市分站优化已成为企业网络营销的重要手段&#xff0c;今天来给大家分享一款城市分站优化系统源码。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.多城市分站管理&#xff1a;该系统支持多个城市分站的管理&#xff0c;用户可以根据业务需求&#xff0c;…

PM大逃亡

欢迎来到程序小院 PM大逃亡 玩法&#xff1a;点击白色的小鬼&#xff0c;滑动鼠标移动&#xff0c;不要碰到黑色的怪物&#xff0c; 怪物会越来越多&#xff0c;看看你能坚持多久&#xff0c;快去大逃亡吧^^。开始游戏https://www.ormcc.com/play/gameStart/233 html <div…

《分布式事务理论基础:CAP定理 BASE理论》

目录 学习目标 1.分布式事务理论基础 1.1.本地事务 1.2.分布式事务 分布式事务产生的原因&#xff1f; 哪些场景会产生分布式事务&#xff1f; 单体系统会产生分布式事务问题吗&#xff1f; 只有一个库&#xff0c;会产生分布式事务问题吗&#xff1f; 分布式事务举…

文本的剪切和复制有区别吗?有什么区别

在电脑操作中&#xff0c;文本的剪切与复制是我们经常进行的操作。尽管它们看起来都是对文本的“复制”行为&#xff0c;但两者在使用和功能上存在明显的差异。本文将详细介绍剪切与复制的区别&#xff0c;以帮助您更好地理解它们的适用场景和作用&#xff0c;并介绍剪切后如何…

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…

基于ElementUI二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

Scrapy使用案例——爬取豆瓣Top 250电影数据

文章目录 什么是Scrapy&#xff1f;创建Scrapy项目编写Scrapy Spider创建Item类配置数据存储运行Scrapy爬虫处理常见问题结论Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全…