链表的经典算法OJ题

news2024/11/22 9:31:43

前言

hello,大家好呀,我是Humble,本篇博客要分享的内容是关于链表的一些力扣OJ题

OK,废话不多说,我们直接开始吧~

题目一

203. 移除链表元素 - 力扣(LeetCode)

题目描述:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node

val == val 的节点,并返回 新的头节点

思路一:遍历原链表,遇到val就执行删除 val 节点的操作

这是一种很容易想到的思路,BUT,执行删除操作修改指针的指向有点麻烦,有没有其他办法?

接下来我们看一下思路二:

定义新链表,遍历原链表找不为val的节点,尾插在新链表上

代码如下:

struct ListNode* removeElements(struct ListNode* head, int val)
 {
    struct ListNode* newHead = NULL;
    struct ListNode* newTail = NULL;

    struct ListNode* pcur = head;//pur用来遍历链表

    while(pcur)
    {
       if (pcur->val!=val)
             {
                 if (newHead == NULL)//链表为空
                    newHead =  newTail = pcur;

                 else 
                 {
                    newTail->next = pcur;
                    newTail = newTail->next;
                 }
             }
       pcur = pcur->next;

    }

    if (newTail)   newTail->next = NULL; //循环结束后让尾节点指向空指针

    return newHead;

}

运行结果:
 

题目二

206. 反转链表 - 力扣(LeetCode)

题目描述

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

这里有一个点值得注意,链表的指针是只能指向后面的,不能反过来,这也是它的一个特性

思路:创建三个指针n1,n2,n3分别记录前驱节点,当前节点,后继节点,改变原链表指针指向

代码如下:

struct ListNode* reverseList(struct ListNode* head) 
{
    if (head == NULL) //如果是空链表,直接返回
        return head;
    
   struct ListNode* n1, *n2, *n3;
   n1 = NULL;
   n2 = head;
   n3 = head->next;
   
   while (n2)
   {
      n2->next = n1;
      n1 = n2;
      n2 = n3;
      if (n3) n3 = n3->next;

   }

  return n1;
}

运行结果如下:

题目三

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

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

对于这道题,我们很直接的会想到要创建一个新链表

而且,如果有看过我的上一篇关于顺序表的算法OJ题博客的小伙伴可能会发现,

本题与那里的题目二——合并两个有序数组有点相像

下面是这道题的代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
   
     if (list1 == NULL)  return list2;
     if (list2 == NULL)  return list1;
     
     struct ListNode* l1 = list1;
     struct ListNode* l2 = list2;

     struct ListNode* newHead,*newTail; 
     newHead = newTail = (struct ListNode*)malloc(sizeof(struct ListNode));
  
     while (l1 && l2)
     {
         if (l1->val < l2->val)
           { 
              newTail->next = l1;
              newTail = newTail->next;
              l1 = l1->next;
            }
        
         else
          {
            newTail->next = l2;
            newTail = newTail->next;
            l2 = l2->next;
          }
     }

     if (l1)  newTail->next = l1;
     if (l2)  newTail->next = l2;
    
     struct ListNode* ret = newHead->next;
     free(newHead);
     return ret;
}


运行结果:

题目四

876. 链表的中间结点 - 力扣(LeetCode)

题目描述:

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

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

对于这道题,Humble的思路是快慢指针

定义两个变量slow和fast

slow每走一步,fast走两步

代码如下:

struct ListNode* middleNode(struct ListNode* head)
 {
    struct ListNode* slow,*fast;
    slow = fast =head;

    while(fast && fast->next) //两个条件顺序不能换!
    {
          slow = slow->next;//slow走一步
          fast = fast->next->next;//fast走两步

    }

   return slow;
}

运行结果如下:

题目五

面试题 02.04. 分割链表 - 力扣(LeetCode)

题目描述:

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前

对于这道题,Humble的思路是:定义两个链表,分别放 小于 x 的 与 大于或等于 x 的

通过遍历原链表分别放进对应的新链表中,最后两个链表按顺序首尾相连

代码如下:

struct ListNode* partition(struct ListNode* head, int x)
{
if (head ==NULL) //空链表直接返回
     return head;

struct ListNode*greaterHead,*greaterTail;
struct ListNode*lessHead,*lessTail;

greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));

struct ListNode* pcur = head;
while (pcur)
    {  
         if (pcur ->val <x)
         {
             lessTail->next = pcur;
             lessTail = lessTail->next;
         }
        else 
        {
         greaterTail->next = pcur;
         greaterTail = greaterTail->next;
        }
      pcur =  pcur->next;
    }
    
greaterTail->next = NULL;//将大链表尾部置为NULL,防止链表循环

lessTail->next = greaterHead->next;

    
    return lessHead->next;
}

运行结果如下:

结语

好了,今天关于链表的五道OJ题的分享就到这里了,如果对大家有帮助就太好啦~

在学习编程的道路上Humble与各位同行,加油吧各位!

最后希望大家点个免费的赞或者关注吧(感谢感谢),也欢迎大家订阅我的专栏

让我们在接下来的时间里一起成长,一起进步吧!

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

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

相关文章

C# 使用屏障来使多线程并发操作保持同步

写在前面 以下是微软官方对屏障类的介绍&#xff0c;System.Threading.Barrier 可用来作为实现并发同步操作的基本单元&#xff0c;让多个线程(参与者)分阶段并行处理目标算法。在达到代码中的屏障点之前&#xff0c;每个参与者将继续执行&#xff0c;屏障表示工作阶段的末尾&…

机器学习实验3——支持向量机分类鸢尾花

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;数据预处理&#x1f9e1;&#x1f9e1;代码认识数据相关性分析径向可视化各个特征之间的关系图 &#x1f9e1;&#x1f9e1;支持向量机SVM求解&#x1f9e1;&#x1f9e1;直觉…

单调栈笔记

单调栈 1.每日温度2.下一个更大元素 I3.下一个更大的元素4.接雨水5.柱状图中最大的矩形 单调栈正如其名字&#xff0c;用一个栈&#xff08;能够实现栈性质的数据结构就行&#xff09;来存储元素&#xff0c;存储在栈中的元素保持单调性&#xff08;单调递增或者是单调递减&…

SE通道注意力机制模块

简介 论文原址&#xff1a;https://arxiv.org/pdf/1709.01507.pdf 在深度学习领域&#xff0c;提升模型的表征能力一直是一个关键的研究方向。SE&#xff08;Squeeze-and-Excitation&#xff09;模块是一种引入通道注意力机制的方法&#xff0c;旨在让神经网络更加关注对当前…

5_机械臂运动学基础_矩阵

上次说的向量空间是为矩阵服务的。 1、学科回顾 从科技实践中来的数学问题无非分为两类&#xff1a;一类是线性问题&#xff0c;一类是非线性问题。线性问题是研究最久、理论最完善的&#xff1b;而非线性问题则可以在一定基础上转化为线性问题求解。 线性变换&#xff1a; 数域…

活动回顾丨云原生技术实践营上海站「云原生 AI 大数据」专场(附 PPT)

AI 势不可挡&#xff0c;“智算”赋能未来。2024 年 1 月 5 日&#xff0c;云原生技术实践营「云原生 AI &大数据」专场在上海落幕。活动聚焦容器、可观测、微服务产品技术领域&#xff0c;以云原生 AI 工程化落地为主要方向&#xff0c;希望帮助企业和开发者更快、更高效地…

机器学习期末复习总结笔记(李航统计学习方法)

文章目录 模型复杂度高---过拟合分类与回归有监督、无监督、半监督正则化生成模型和判别模型感知机KNN朴素贝叶斯决策树SVMAdaboost聚类风险PCA深度学习范数计算梯度下降与随机梯度下降SGD线性回归逻辑回归最大熵模型适用性讨论 模型复杂度高—过拟合 是什么&#xff1a;当模型…

应用监控 eBPF 版:实现高效协议解析的技术探索

作者&#xff1a;彦鸿 引言 随着 Kuberentes 等云原生技术的飞速发展&#xff0c;带来了研发与运维模式的变革。企业软件架构由单体服务向分布式、微服务演进。随着业务发展&#xff0c;多语言、多框架、多协议的微服务在企业中越来越多&#xff0c;软件架构复杂度越来越高&a…

excel(wps)之vlookup函数合并sheet数据

VLOOKUP函数是Excel中的一个纵向查找函数&#xff0c;它与LOOKUP函数和HLOOKUP函数属于一类函数&#xff0c;在工作中都有广泛应用&#xff0c;例如可以用来核对数据&#xff0c;多个表格之间快速导入数据等函数功能。功能是按列查找&#xff0c;最终返回该列所需查询列序所对应…

C++并发编程 -1.线程管理

本栏主要介绍《C并发实战编程》这本书&#xff0c;链接。 将按照书目录分为 九章节介绍C并发编程&#xff0c;尽可能简化本书内晦涩难懂知识点。 本章节主要讲解线程使用基础。详细介绍线程使用基础&#xff08;线程发起、等待、参数、异常处理&#xff09;、线程管控(归属权、…

设计模式——1_6 代理(Proxy)

诗有可解不可解&#xff0c;若镜花水月勿泥其迹可也 —— 谢榛 文章目录 定义图纸一个例子&#xff1a;图片搜索器图片加载搜索器直接在Image添加组合他们 各种各样的代理远程代理&#xff1a;镜中月&#xff0c;水中花保护代理&#xff1a;对象也该有隐私引用代理&#xff1a;…

uniapp点击事件报错 Cannot read property ‘stopPropagation‘ of undefined

问题产生&#xff1a;在列表上有个小按钮&#xff0c;可点击弹出选择框。 列表本身可点击进入详情页。所以想用click.stop来阻止点击小按钮时候&#xff0c;触发列表的点击事件。 结果&#xff1a;如图所示 解决方案&#xff1a;发现自己用的是icon&#xff0c;在icon上加click…

Web3 游戏开发者的数据分析指南

作者&#xff1a;lesleyfootprint.network 在竞争激烈的 Web3 游戏行业中&#xff0c;成功不仅仅取决于游戏的发布&#xff0c;还需要在游戏运营过程中有高度的敏锐性&#xff0c;以应对下一次牛市的来临。 人们对 2024 年的游戏行业充满信心。A16Z GAMES 和 GAMES FUND ONE …

windows和linux下SHA1,MD5,SHA256校验办法

今天更新android studio到Android Studio Hedgehog | 2023.1.1时&#xff0c;发现提示本机安装的git版本太老&#xff0c;于是从git官网下载最新的git。 git下载地址&#xff1a; https://git-scm.com/ 从官网点击下载最新windows版本会跳转到github仓库来下载发布的git&…

uniapp小程序实现自定义返回按钮和胶囊对齐 做到兼容各手机型号

效果&#xff1a; 用到的API&#xff1a; uni.getMenuButtonBoundingClientRect();官网地址&#xff1a; https://uniapp.dcloud.net.cn/api/ui/menuButton.html#getmenubuttonboundingclientrect 控制台打印&#xff1a; 代码示例&#xff1a; <template><view cl…

惬意上手python —— JSON模块介绍

JSON模块简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于阅读和编写&#xff0c;同时也易于机器解析和生成。在Python中&#xff0c;我们可以使用json模块来处理JSON数据。本文将介绍如何使用Python的json模块进行JS…

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)

Redis解决方案&#xff1a;NOAUTH Authentication required&#xff08;连接jedis绑定密码或修改redis密码&#xff09; Java使用jedis连接redis时出现错误NOAUTH Authentication required 一、问题报错和原因 本地设置了redis的密码&#xff0c;但在远程连接时并没有输入密…

【深度学习:数据管理工具】2024 年计算机视觉的 7 大数据管理工具

【深度学习&#xff1a;数据管理工具】2024 年计算机视觉的 7 大数据管理工具 什么是计算机视觉中的数据管理&#xff1f;在计算机视觉中的数据管理工具中要考虑什么&#xff1f;Data Prioritization 数据优先级Visualizations 可视 化Model-Assisted Insights 模型辅助见解Mod…

解锁加密货币增长的秘密:通过 Token Explorer 解读市场信号

解读市场信号&#xff0c;就像医生通过观察患者的体征来判断健康状况一样&#xff0c;可以帮助我们评估加密货币的采用速度。 Token Explorer 这个工具&#xff0c;就像是我们医生的听诊器&#xff0c;它追踪了一些核心的采用指标&#xff1a; ● 市值&#xff1a;通过比较主…

【c++学习】数据结构中的链表

c链表 数据结构中的链表代码 数据结构中的链表 链表与线性表相对&#xff0c;链表数据在内存中的存储空间是不连续的&#xff0c;链表每个节点包含数据域和指针域。 代码 下述代码实现了链表及其接口 包括增、删、查、改以及其他一些简单的功能 #include <iostream>u…