【LeetCode】单链表——刷题

news2024/11/17 19:49:12

你曾经灼热的眼眶,是人生中少数的笨拙又可贵的时刻。

文章目录

1.反转单链表

题目思路及图解 

代码中需要注意的问题

2.移除链表元素

题目思路及图解

代码中需要注意的问题


  大家好,我是纪宁。

  这篇文章分享给大家一些经典的单链表leetcode笔试题的解法。

  先导知识:数据结构——单链表

1.反转单链表

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

题目思路及图解 

   思路:将单链表的每个结点的指针域从前到后逐个变向,整体上看就是将单链表反向

  定义三个结构体变量 n1,n2,n3,其中 n1,n2 用来改变结点指向,n3用来存储当前结点的下一个结点的地址,即当前结点的 next  

  改变指向图解,初始情况下,n1指向空,n2指向第一个结点,n2指向第二个结点。

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

代码中需要注意的问题

1.当传进来结点为空的时候,不能让 n3 = n2 -> next,因为n2没有下一个结点。

2.要先改变指向,再将n1,n2,n3 进行前移。因为开始结点翻转后就变成了尾结点,尾结点的 next 必须指向NULL。

3.当n1,n2,n3前移时,要对 n3 是否为NULL进行判断。因为判定循环结束是当 n2 移动到 NULL 的时候,在这之前,n3 会先一步达到NULL,是时候就要进行判断,如果n3已为NUL的时候,就不能再让 n3 前移,否则会出现越界情况。

2.移除链表元素

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

题目思路及图解

思路:删除一个结点,要知道这个结点前一个结点的信息和下一个结点的信息,那么就必须定义两个结构体指针变量,一个指向当前结点,一个指向这个结点的前一个结点。

  定义一个指针变量 prev,负责指向前一个结点,先让它指向 NULL ;定义一个指针变量 cur ,负责指向当前结点,先让它指向头结点

  常规情况下(要删除的结点在中间或末尾),只需要当 cur-> val 的值等于 val 时,让 cur 指向 cur 的下一个结点,再释放原来的空间即可,只需要保证 prev 一直在 cur 的后面跟着。

   当第一个结点就是要删除结点的时候,就需要移动头结点了。当找到第一个不等于 val 的结点的时候,再将 cur 的值赋给 prev,prev 才能开始移动第一次移动,接着 cur 再向前移动。

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode*cur=head;
    struct ListNode*prev=NULL;
    while(cur!=NULL)
    {
        if(cur->val==val)
        {
             if(head->val==val)
             {
                 head=cur->next;
                 free(cur);
                 cur=head;
             }
             else
             {
                prev->next=cur->next;
                free(cur);
                cur=prev->next;
             }
        }
        else
        {
            prev=cur;
            cur=cur->next;
        }
    }
    return head;
}

代码中需要注意的问题

  当需要删去某个结点的时候,将 prev 的下一个结点赋值为要删除结点的下一个结点,再释放这个结点的空间,就能做到将要删结点的前一个和后一个连起来。

  当不需要删去某个结点,正常遍历链表时,每次先将prev的值赋为cur,再将cur 指向下一个结点( cur = cur -> next ),这样就做到了prev与 cur 一起前进,且 prev 一直在 cur 的前一个结点处。

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

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

相关文章

【Unity 实用插件篇】 | 行为状态机StateMachine,规范化的管理对象行为

前言【Unity 实用插件篇】 | 行为状态机StateMachine 学习使用一、StateMachine行为状态机 介绍二、StateMachine 结构分析三、StateMachine状态机详细使用流程3.1 第一步:创建状态机Transition Table SO3.2 第二步:创建对应状态的 State SO3.3 第三步:创建状态的切换条件 C…

Hadoop学习指南:探索大数据时代的重要组成——运行环境搭建

Hadoop运行环境搭建(开发重点) 模板虚拟机环境准备 数据来源层 安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存4G、硬盘50G hadoop100 虚拟机配置要求如下(本文Linux系统全部以CentOS-7.5-x86-1804为例&#…

小研究 - Java 虚拟机实现原理分析

针对虚拟机的底层实现原理及相关实现过程,讨论了 Java 语言的跨平台原理以及相关工作机制,分析了 JVM 底层各数据区内存管理过程,阐述了 JVM 在 Java 语言中的核心作用以及重要地位。 目录 1 概述 2 Java 平台分层原理 3 虚拟机工作原理 …

CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark

文章目录 1. 整体架构2. 环境准备3. 配置全局变量4. 创建专属工作目录和存储桶5. 创建 EMR Serverless Execution Role6. 创建 EMR Serverless Application7. 提交 Apache Hudi DeltaStreamer CDC 作业7.1 准备作业描述文件7.2 提交作业7.3 监控作业7.4 错误检索7.5 停止作业 8…

仿转转闲鱼链接后台生成

教程:修改数据库账号密码直接使用。 源码带有教程! 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法 如下图所示,打开TIA博途,新建一个项目,添加一个PLC UDT数据类型Iomap,数据类型为Array[0…49] of Byte, 如下图所示,再添加一个全局DB块,在DB块中添加一个变量map,数据类型为Iomap, 如下图所示,在PLC变量表中添加一…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中,遇到了实时音视频呼叫通知,当App未打开或者App在后台时候,需要通知到用户,用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

【微服务】springboot整合mongodb使用详解

目录 一、mongodb简介 1.1 什么是mongodb 1.2 mongodb特点 二、mongodb中的核心术语 2.1 mogodb与数据库对比 2.2 mongodb中的核心概念 2.3 与关系数据库的差异 2.3.1 半结构化 2.3.2 支持多级嵌套 2.3.3 关系弱化 三、mongodb 技术优势和应用场景 3.1 mongodb 技术…

redis主从复制哨兵Cluster

目录 前言 一、模式介绍 1.1 主从复制 1.2 哨兵 1.3 集群 二、主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 三、Redis 哨兵模式 3.1 哨兵模式原理 3.2 哨兵模式的作用 3.3 哨兵组成结构 3.4 哨兵故障转移机制 3.5 搭建Redis 哨兵模式…

利用频谱仪进行简单的2.4G 频率测试

一、概述 1. 信号源 我们开发2.4G 无线产品的时候,经常需要对产品的无线信号进行测试,以确定精确的频率。在进行频率测试之前,我们的2.4G 射频芯片需要进入单载波模式。 2. 频谱仪 这里选择的是普源的频谱仪。测试范围是 9kHz - 3.2GHz。…

【工具篇】Lombok 介绍及使用(详细教程)

Lombok 介绍及使用 一,Lombok介绍 在 Java 开发中,常常需要编写大量的getter、setter方法、equals和hashCode方法、构造函数等重复且繁琐的代码。 为了减少 Java 代码中的冗余和样板代码,提高代码的可读性和开发效率,就有了Lomb…

数据结构: 线性表(无哨兵位单链表实现)

文章目录 1. 线性表的链式表示: 链表1.1 顺序表的优缺点1.2 链表的概念1.3 链表的优缺点1.4 链表的结构 2. 单链表的定义2.1 单链表的结构体2.2 接口函数 3. 接口函数的实现3.1 动态申请一个结点 (BuySListNode)3.2 单链表打印 (SListPrint)3.3 单链表尾插 (SListPushBack)3.4 …

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度6

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

【LangChain】向量存储(Vector stores)

概要 存储和搜索非结构化数据的最常见方法之一是嵌入它并存储生成的嵌入向量,然后在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。向量存储负责存储嵌入数据并为您执行向量搜索。 内容 本篇讲述与 VectorStore 相关的基本功能。使用向量存储的一…

【Git】远程仓库的创建、SSH协议克隆、拉取、推送

目录 一、创建远程仓库 二、HTTPS协议克隆仓库 三、SSH协议克隆仓库 四、向远程仓库推送 五、从远程仓库拉取 六、忽略特殊文件 七、配置命令别名 一、创建远程仓库 首先我们可以从GitHub或者Gitee中创建自己的个人仓库 工作台 - Gitee.comhttps://gitee.com/ 二、HTT…

Sestra 实用教程(三)输入与输出

目 录 一、前言二、分析流程三、输入文件3.1 模型与荷载3.2 分析控制数据 四、输出文件五、参考文献 一、前言 SESAM (Super Element Structure Analysis Module)是由挪威船级社(DNV-GL)开发的一款有限元分析(FEA&…

关于在VS2017中编译Qt项目遇到的问题

关于在VS2017中编译Qt项目遇到的问题 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。如何在VS2017里部署的Qt Designer上编辑槽函数 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。 链接 如何在VS2017里部署的Qt Design…

【LeetCode】解码方法

这里写目录标题 题目描述算法流程编程代码代码优化 链接: 解码方法 题目描述 算法流程 编程代码 class Solution { public:int numDecodings(string s) {int n s.size();vector<int> dp(n);dp[0] s[0] ! 0;if(n 1) return dp[0];if(s[1] < 9 && s[1] >…

python之编写form表单提交到后端

一、环境配置 我们先去python的框架中下载Flask&#xff0c;具体的配置我给大家找了一篇博客讲解&#xff0c;环境调试没问题后&#xff0c;开始我们form表单提交的过程 Python之flask框架_python flask_【网络星空】的博客-CSDN博客 二、前端代码 在VScode里编写前端的代码为…

移动端加入购物车界面设计

效果图 源码如下 页面设计 <template><div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&…