单链表经典算法题 1

前言 

学习了单链表,我们就做一些题来巩固一下。还有就是解题方法不唯一,我就只讲述为自己的方法。

目录

前言 

1.移除链表元素

 思路

代码 

2.反转链表

 思路

 代码 

3.链表的中间节点

思路 

 代码 

总结


1.移除链表元素

 思路

我们创建一个新的表,来储存和val值不一样的节点。还可以在原表上删除和val值相同的节点。

这里我是新创建一个表来接受不等于val的节点。通过发现我们应该通过采取尾插的方式来储存新节点。如果循环里面就只要尾插会导致新表的头节点还是指向空指针,导致输出错误。所以还要考虑新链表的头节点是否为空,为空的话我们就新表的头节点和尾节点指向第一个节点。

完成以上步骤后会变成下面的样子,最后一个节点还是指向要被删除的节点。导致输出结果还是含有被删除的值。所以我们要进行优化,把新链表的尾节点指向NULL。最后返回头节点就可以了。

代码 

typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) 
{
   ListNode*newhead,*newtail;//新链表的头尾节点
   newhead=newtail=NULL;
   //遍历原链表
   ListNode* prev=head;
   while(prev)
   {
    if(prev->val!=val)
    {
        if(newhead==NULL)
        {
            newhead=newtail=prev;
        }
        else
        {
            newtail->next=prev;
            newtail=newtail->next;
        }
    }
    prev=prev->next;
   }
   if(newtail)
   newtail->next=NULL;
   return newhead;
}

2.反转链表

 思路

这里我的想法是反转链表指向来实现题目的效果,定义3个节点,分别用来存储NULL、第一个节点、第二个节点循环反转指向,然后在循环让3个节点都向后移动,其中n3、最先指向空其次是n2、最后是n1  n2->next=n1;      n1=n2;     n2=n3;    n3=n3->next;   这些就是向后移动的代码

我们最后要返回含val=5的节点所以我们就让n2充当循环结束的条件,但是这样写会出错,因为n3最早变成空指针,就可以对空指针进行解引用操作了。所以在前面加上一个if版判语句

if(n3)n3=n3->next;   最后返回n1就可以了。

如下图所示

 代码 

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) 
{
    if(head==NULL)
    {
        return head;
    }
    ListNode* n1,* n2,* n3;
    n1=NULL,n2=head,n3=n2->next;
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)
        n3=n3->next;
    }
    return n1;
}

3.链表的中间节点

思路 

这里介绍一种新奇的方法,那就是快慢指针。快指针移动两次,慢指针移动一次。这里大家先知道怎么移动行了,不用深究为什么。后面我会为大家解答的。

根据例1移动我们发现当fast移动到最后时,slow就是我们要返回的值。我们又要把fast当作循环结束的条件。所以我们就可以想到fast->next 指针为空指针时结束循环。

根据例2移动我们可以等到循环结束的条件为fast为空指针时为循环结束条件。

我们把他们结合起来当作循环条件这样就万无一失了。返回慢指针(slow)

 

 代码 

typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) 
{
    ListNode* slow=head;
    ListNode* fast=head;
    while(fast && fast->next)
    {
         slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

总结

做这种链表的问题最好就是画图理清思路,然后再写代码。后还会为大家讲解单链表经典算法题 2。会持续更新的哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

直播预约:存内计算加速大模型-未来智能计算的新引擎

直播简介: 在人工智能飞速发展的今天,大模型的训练和推理对计算资源的需求日益增长。传统计算架构已逐渐难以满足其对速度和效率的极致追求。本次直播,我们将深入探讨如何利用存内计算技术,为大模型带来革命性的加速效果。 直播亮点: 技术…

易趋(EasyTrack)资深咨询顾问刘苗受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 易趋(EasyTrack)资深咨询顾问刘苗女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“企业级项目管理平台推动 IPD 数字化”。大会将于6月29-30日在北京举办,敬请关注! 议…

开源AGV调度系统OpenTCS中的路由器(router)详解

OpenTCS中的任务分派器router详解 1. 引言2. 路由器(router)2.1 代价计算函数(Cost functions)2.2 2.1 Routing groups2.1 默认的停车位置选择2.2 可选停车位置属性2.3 默认的充电位置选择2.4 即时运输订单分配 3. 默认任务分派器的配置项4. 参考资料与源…

SpringBoot3 整合 Mybatis 完整版

本文记录一下完整的 SpringBoot3 整合 Mybatis 的步骤。 只要按照本步骤来操作&#xff0c;整合完成后就可以正常使用。1. 添加数据库驱动依赖 以 MySQL 为例。 当不指定 依赖版本的时候&#xff0c;会 由 springboot 自动管理。 <dependency><groupId>com.mysql&l…

C++ 33 之 const 修饰静态成员

#include <iostream> #include <string.h> using namespace std;// 定义静态const数据成员时&#xff0c;最好在类内部初始化,避免在类外重复初始化&#xff0c;也为了代码的可读性和可维护性class Students03{ public:// 两种写法都可以const static int s_a 10;…

期末测试2(1)---PTA

一开始写错了&#xff0c; 因为这个再定义一个和原函数一样类型的进行存储&#xff0c; 然后将第一个设置为最大的&#xff0c;依次用循环比较后面的&#xff0c; 最后输出 但是这个适用于找最大的、字符串这样最后只输出一个最大项比较好 对于结构体不好将比较的这个数所…

Java9 后String 为什么使用byte[]而不是char?

之前认知里面&#xff0c;java的String一直是使用char数组&#xff0c;但是今天点进去瞟了一眼&#xff0c;发现不对。 源码如下&#xff1a; /*** The value is used for character storage.** implNote This field is trusted by the VM, and is a subject to* constant fold…

boot项目配置邮箱发送

最近项目准备进入测试阶段&#xff0c;时间相对充沛些&#xff0c;便对邮箱的信息发送记录下&#xff01; 邮箱设置-开启smtp协议及获取授权码 以QQ邮箱为例&#xff0c;其他邮箱大同小异&#xff01; 开启协议 获取授权码 具体代码 基于javax.mail实现 原文可看 前辈帖子…

vscode 终端无法正常执行脚本命令如何解决

我们经常需要在vscode的中安装第三方依赖包&#xff0c;npm是前端目前最大的Node.js模块化管理系统&#xff0c;它能帮助开发者管理和发布Node.js模块。但很多时候我们在vscode的终端中执行npm install命令时经常会报以下错误&#xff1a; 但是在Windows的cmd命令提示符中执行n…

观测云产品更新 | BPF 网络日志、智能监控、告警策略等

观测云更新 网络 BPF 网络日志&#xff1a;优化 BPF 网络功能&#xff0c;增强 L4/L7 网络联动。 APM/RUM APM/RUM&#xff1a;新增 【Issue 自动发现】功能。启用该配置后&#xff0c;观测云会将符合配置项规则的错误数据记录自动创建 Issue。 监控 1、智能监控&#xff1…

【CT】LeetCode手撕—102. 二叉树的层序遍历

目录 题目1-思路2- 实现⭐102. 二叉树的层序遍历——题解思路 3- ACM实现3-1 二叉树构造3-2 整体实现 题目 原题连接&#xff1a;102. 二叉树的层序遍历 1-思路 1.借助队列 Queue &#xff0c;每次利用 ①while 循环遍历当前层结点&#xff0c;②将当前层结点的下层结点放入 …

GitCode热门开源项目推荐:Spider网络爬虫框架

在数字化高速发展时代&#xff0c;数据已成为企业决策和个人研究的重要资源。网络爬虫作为一种强大的数据采集工具受到了广泛的关注和应用。在GitCode这一优秀的开源平台上&#xff0c;Spider网络爬虫框架凭借其简洁、高效和易用性&#xff0c;成为了众多开发者的首选。 一、系…

反向海淘建站技术:开启跨境电商新篇章

反向海淘&#xff0c;作为跨境电商的一种创新模式&#xff0c;正逐渐改变着传统贸易的格局。在这个模式下&#xff0c;国内消费者能够直接购买到国外的商品&#xff0c;而国内的商家也能将产品销往海外市场。为了抓住这一机遇&#xff0c;建立一套高效、稳定的反向海淘网站至关…

线代老师大PK,这四位胜出!

说实话&#xff0c;线代真的别乱跟老师 因为每个老师讲课适用的人群不一样&#xff0c;比如都说李永乐老师线代讲的好&#xff0c;但是我去听完发现&#xff0c;李永乐老师的线代讲的虽然好&#xff0c;但是对于零基础或者基础不好的考生来说&#xff0c;真的有点不友好&#…

AI绘画SD3已来,本地首发实测体验,含本地部署说明(内附网盘模型及ComfyUI工作流下载)

大家好&#xff0c;我是画画的小强 SD3已来&#xff0c;Stability AI 此前宣布SD3将于6月12开源20 亿参数的SD3 模型SD3 Medium&#xff0c;昨天它已如期而至了。 根据官方内容所了解&#xff0c;SD3 Medium 可以说是目前很先进的文本到图像开放模型&#xff0c;包含 20 亿个…

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

线性代数|机器学习-P12Ax=b条件下x最小值问题

文章目录 1. Axb下的最值问题-图形转换2. Gram-Schmidt 标准形3. 迭代法-Krylov子空间法 1. Axb下的最值问题-图形转换 假设我们有一个直线方程如下&#xff1a; 3 x 1 4 x 2 1 \begin{equation} 3x_14x_21 \end{equation} 3x1​4x2​1​​ 在二维平面上&#xff0c;各个范…

微信小程序投票系统(包含微信小程序端)

&#x1f4f1;微信投票小程序&#xff1a;轻松发起&#xff0c;快速统计 一、引言 在数字化时代&#xff0c;微信作为我们日常生活中不可或缺的社交工具&#xff0c;不仅为我们提供了沟通交流的平台&#xff0c;还衍生出了许多实用的小程序。其中&#xff0c;微信投票小程序凭…

C# WPF入门学习主线篇(三十三)—— 使用ICommand实现命令绑定

C# WPF入门学习主线篇&#xff08;三十三&#xff09;—— 使用ICommand实现命令绑定 在MVVM模式中&#xff0c;命令绑定是将用户交互&#xff08;如按钮点击&#xff09;与ViewModel中的方法连接起来的一种机制。使用ICommand接口可以实现这一功能&#xff0c;从而将UI逻辑与业…

快速掌握 Python requests 库发送 JSON 数据的 POST 请求技巧

在现代 Web 开发中&#xff0c;客户端与服务器之间进行数据交换的需求越来越普遍。而在 Python 这个强大的编程语言中&#xff0c;requests 库是一个广泛使用且功能强大的 HTTP 请求库。特别是在进行 API 调用时&#xff0c;发送 POST 请求并附带 JSON 数据是一个非常常见的需求…