力扣练习——链表在线OJ
目录
提示:
一、移除链表元素
题目:
解答:
二、反转链表
题目:
解答:
三、找到链表的中间结点
题目:
解答:
四、合并两个有序链表(经典)
题目:
解答:
提示:
①:接上一篇文章http://t.csdnimg.cn/vvmIr
本次我们来做一些在线OJ题,进一步加深印象和感觉,并且本次某些方法会沿用上一篇文章的,所以感兴趣的小伙伴可以参考一下上一篇文章。
②:对于这些在线OJ,小编会把具体步骤放在注释里面,然后小编没有画图,大家可自行画图然后跟着解析思路一起思考。
③:链表的在线OJ一般都是用的无哨兵的头指针,所以大家一定要搞懂有哨兵和无哨兵的区别。
一、移除链表元素
题目:
解答:
思路:只需要一边遍历链表,一边进行数据域的比较。若找到指定的值val,则删除该结点;
又因为删除一个结点,我们必须知道该结点的前一个结点,所以采用双指针的思路:
一个指针prve用于记录指定结点的前一个结点;
一个指针cur用于遍历寻找。
另外,找的过程中会发生两种情况;
情况一:指定结点为头结点(即头指针的位置):这时我们需要考虑头指针head的变化,具体实现看注释;
情况二:指定结点为一般结点:这时我们就依靠前一个结点正常删除即可;
源代码即注释如下:
struct ListNode* removeElements(struct ListNode* head, int val) {//双指针prev、curstruct ListNode* prev = NULL, *cur = head;//当cur==NULL。即过了尾结点,遍历完成,退出循环while (cur){//数据域相等,说明找到要删的结点if (cur->val == val){//分为两种情况,一是头删,二是正常删除if (cur == head)//头删{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; }
二、反转链表
题目:
解答:
思路:我们可以将当前结点的next域指向前一结点,但在此之前我们应该把当前结点的前一个结点和后一个结点给保存下来,防止结点丢失;
所以我们可以创建两个临时指针prve和cur;
cur用于保存下一个结点;
prve用于保存前一个结点;
而头结点head就用于保存当前结点;
struct ListNode* reverseList(struct ListNode* head) {//两个临时指针struct ListNode* cur = head, * prve = NULL;//因为cur是用于保存下一个结点,所以当cur为空时,即遍历完链表,循环结束while (cur){//cur保存下一个结点cur = cur->next;//将当前结点的next域指向前一个结点head->next = prve;//将prve保存当前结点,也就是保存下一轮操作的"前一个结点"prve = head;//完成一轮操作,head重定位当前结点head = cur;}//最后当head和cur都为NULL时,prve作为前一个结点即为"原链表的尾结点,反转链表的首结点”,所以返回prvereturn prve; }
三、找到链表的中间结点
题目:
解答:
这道题用到一个经典思路叫:“快慢指针”;
即定义两个指针;
一个快指针fast,一次向后跳过两个结点;
一个慢指针slow,一次向后跳过一个结点;
初略想一下,当fast指针遍历完数组后,solw指针就是我们想要的中间结点;
但这里要分奇数个结点还是偶数个结点,如下:
奇数个结点的情况:
偶数个结点的情况:
所以结束有两个可能,即快指针指向尾结点或者快指针指向NULL;
struct ListNode* middleNode(struct ListNode* head) {//快指针fast,慢指针slowstruct ListNode* fast = head, * slow = head;//因为不确定奇数个还是偶数个,所以当快指针任意满足一种情况,则结束while (fast && fast->next){//慢指针走一步slow = slow->next;//快指针走两步fast = fast->next->next;}return slow; }
四、合并两个有序链表(经典)
题目:
解答:
①:由合并升序链表,我们可以联想到合并升序顺序表(数组),我们知道是将大的一个数放在大空间的末尾,第二大的数放在大空间的倒数第二个位置,重复此操作,直到短的一方比较完,再把长的一方剩下的元素连接在末尾;
②:但链表和顺序表有一点区别是,链表只需要逻辑上相邻即可;
③:所以我们可以创建两个临时指针:
一个临时指针head用于充当新合并链表的头指针;
一个临时指针tail用于插入操作;
④:具体我们只需要将两个链表中的元素依次比较,再将数据域小的结点尾插到tail链表后面,因为tail和head指向同一个链表,只是head是头指针,过程中是tail再变,所以要注意tail指针的变化,最后返回head头指针即可。
⑤:其中我们可能遇到三种情况:
情况一、链表一或链表二为空,则直接返回另一个链表;
情况二、链表一和链表二长度相等,则循环上述操作;
情况三、长度不相等,则操作到某一时刻,链表一或二就会为NULL,这时就会出循环,然后再将长的链表剩下的元素插到tail结点后面。
//将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {//情况一、表一或表二为NULL,直接返回另一个表if (list1 == NULL)return list2;if (list2 == NULL)return list1;//情况二、按正常操作来进行struct ListNode* head = NULL, * tail = NULL;while (list1 && list2){//依次比较数据域if (list1->val < list2->val){//第一次需要将head和tail指针指向首结点较小的表,以便后续能尾插结点if (tail == NULL){head = tail = list1;}//尾插else{tail->next = list1;tail = tail->next;}list1 = list1->next;}else{//第一次需要将head和tail指针指向首结点较小的表,以便后续能尾插结点if (tail == NULL){head = tail = list2;}//尾插else{tail->next = list2;tail = tail->next;}list2 = list2->next;}}//情况三、两个表长度不相等,会有一个表有剩余//因为是升序表,所以直接将剩余的表插入tail的next域即可if (list1){tail->next = list1;}if (list2){tail->next = list2;}//最后返回合并的表的头指针return head; }
本次知识到此结束,希望对你有所帮助!
相关文章:
力扣练习——链表在线OJ
目录 提示: 一、移除链表元素 题目: 解答: 二、反转链表 题目: 解答: 三、找到链表的中间结点 题目: 解答: 四、合并两个有序链表(经典) 题目: 解…...
四、互联网技术——局域网拓扑结构
文章目录 一、局域网拓扑结构二、虚拟局域网VLAN三、交换机VLAN划分四、VLAN的作用五、交换机的端口类型六、经典三层网络架构七、例题:局域网带宽利用分析八、网络安全基础九、恶意软件十、防火墙与入侵检测技术 一、局域网拓扑结构 局域网的主要特征由网络的拓扑结构、所采用…...
Spring Webflux DispatcherHandler源码整理
DispatcherHandler的构造(以RequestMappingHandlerMapping为例) WebFluxAutoConfiguration中EnableWebFluxConfiguration继承WebFluxConfigurationSupportBean public DispatcherHandler webHandler() {return new DispatcherHandler(); }DispatcherHandler#setApplicationCon…...
【Netty】ByteToMessageDecoder源码解析
目录 1.协议说明 2.类的实现 3.Decoder工作流程 4.源码解析 4.1 ByteToMessageDecoder#channelRead 4.2 累加器Cumulator 4.3 解码过程 4.4 Decoder实现举例 5. 如何开发自己的Decoder 1.协议说明 Netty框架是基于Java NIO框架,性能彪悍,支持的协…...
DevEco Studio设置Nodejs提示路径只能包含英文、数字、下划线等
安装DevEco Studio 3.1.1 Release 设置Nodejs路径使用nodejs默认安装路径 (C:\Program Files\nodejs) 提示只能包含英文、数字、下划线等 , 不想在安装nodejs请往下看 nodejs默认路径报错 修改配置文件 1、退出DevEco Studio 2、打开配置文件 cmd控制台…...
大模型 Decoder 的生成策略
本文将介绍以下内容: IntroductionGreedy Searchbeam searchSamplingTop-K SamplingTop-p (nucleus) sampling总结 一、Introduction 1、简介 近年来,由于在数百万个网页数据上训练的大型基于 Transformer 的语言模型的兴起,开放式语言生…...
队列和栈相互实现
相关题目 225. 用队列实现栈:弹出元素时,将对首的元素出列加到队尾,直到只剩下初始队列时队尾一个元素为止,然后弹出这个元素,即可实现LIFO 232. 用栈实现队列:用两个栈实现队列的功能,出栈时&a…...
Node.js 是如何处理请求的
前言:在服务器软件中,如何处理请求是非常核心的问题。不管是底层架构的设计、IO 模型的选择,还是上层的处理都会影响一个服务器的性能,本文介绍 Node.js 在这方面的内容。 TCP 协议的核心概念 要了解服务器的工作原理首先需要了…...
数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)
数组中的第K个最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。…...
SpringBoot快速入门
搭建SpringBoot工程,定义hello方法,返回“Hello SpringBoot” ②导入springboot工程需要继承的父工程;以及web开发的起步依赖。 ③编写Controller ④引导类就是SpringBoot项目的一个入口。 写注解写main方法调用run方法 快速构建SpringBoo…...
深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据
1、首先,导入所需的库和模块,包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。 import numpy as np import torch from torchvision.datasets import mnist import torchvision.transf…...
高效的开发流程搭建
目录 1. 搭建 AI codebase 环境kaggle的服务器1. 搭建 AI codebase 环境 python 、torch 以及 cuda版本,对AI的影响最大。不同的版本,可能最终计算出的结果会有区别。 硬盘:PCIE转SSD的卡槽,, GPU: 软件源: Anaconda: 一定要放到固态硬盘上。 VS code 的 debug功能…...
浅谈OV SSL 证书的优势
随着网络威胁日益增多,保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中,OV(Organization Validation)证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在,为网站安全搭建坚实的防线…...
一篇博客学会系列(3) —— 对动态内存管理的深度讲解以及经典笔试题的深度解析
目录 动态内存管理 1、为什么存在动态内存管理 2、动态内存函数的介绍 2.1、malloc和free 2.2、calloc 2.3、realloc 3、常见的动态内存错误 3.1、对NULL指针的解引用操作 3.2、对动态开辟空间的越界访问 3.3、对非动态开辟内存使用free释放 3.4、使用free释放一块动态…...
【C++ techniques】虚化构造函数、虚化非成员函数
constructor的虚化 virtual function:完成“因类型而异”的行为;constructor:明确类型时构造函数;virtual constructor:视其获得的输入,可产生不同的类型对象。 //假如写一个软件,用来处理时事…...
蓝牙核心规范(V5.4)11.6-LE Audio 笔记之初识音频位置和通道分配
专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!! 音频位置 在以前的每个蓝牙音频规范中,只有一个蓝牙LE音频源和一个蓝牙LE音频接…...
mysql双主+双从集群连接模式
架构图: 详细内容参考: 结果展示: 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)...
嵌入式中如何用C语言操作sqlite3(07)
sqlite3编程接口非常多,对于初学者来说,我们暂时只需要掌握常用的几个函数,其他函数自然就知道如何使用了。 数据库 本篇假设数据库为my.db,有数据表student。 nonamescore4嵌入式开发爱好者89.0 创建表格语句如下: CREATE T…...
RandomForestClassifier 与 GradientBoostingClassifier 的区别
RandomForestClassifier(随机森林分类器)和GradientBoostingClassifier(梯度提升分类器)是两种常用的集成学习方法,它们之间的区别分以下几点。 1、基础算法 RandomForestClassifier:随机森林分类器是基于…...
计组——I/O方式
一、程序查询方式 CPU不断轮询检查I/O控制器中“状态寄存器”,检测到状态为“已完成”之后,再从数据寄存器取出输入数据。 过程: 1.CPU执行初始化程序,并预置传送参数;设置计数器、设置数据首地址。 2. 向I/O接口发…...
一条命令搞定STM32程序下载:OpenOCD program命令的隐藏用法与避坑指南
STM32极速烧录秘籍:OpenOCD program命令高阶玩法全解析 每次调试STM32都要重复点击IDE的下载按钮?CI/CD流水线卡在烧录环节?是时候解锁OpenOCD的program命令了——这个被低估的"瑞士军刀"能让你用一行命令完成擦除、烧录、校验、复…...
离散数学实战:用Python解决图论问题(附完整代码示例)
离散数学实战:用Python解决图论问题(附完整代码示例) 当你在社交软件上查看"可能认识的人"推荐,或是用导航软件规划最短路线时,背后都在运行图论算法。作为离散数学中最具工程价值的领域,图论将现…...
Matlab GUI 计时器:基于定时器对象自动更新的数字时钟演示
Matlab图形用户界面计时器:使用定时器对象自动更新的MatlabGUI,一个数字时钟,作为显示基本组件的快速演示,带有一个按钮,用于恢复/暂停执行更新实验室配了新酶标仪孵箱但总有人(比如同组摸鱼的小师妹顺便喊…...
ABC系统实战指南:革新数字电路设计的逻辑综合与形式验证技术突破
ABC系统实战指南:革新数字电路设计的逻辑综合与形式验证技术突破 【免费下载链接】abc ABC: System for Sequential Logic Synthesis and Formal Verification 项目地址: https://gitcode.com/gh_mirrors/ab/abc 在现代集成电路设计流程中,工程师…...
Llama-3.2V-11B-cot入门必看:Streamlit组件热重载加速UI迭代开发
Llama-3.2V-11B-cot入门必看:Streamlit组件热重载加速UI迭代开发 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B多模态大模型开发的高性能视觉推理工具,专为双卡4090环境深度优化。该工具通过Streamlit框架构建了直观易用的交互界面&#…...
提示工程架构师实战手册:2025年基于最新趋势的AI项目设计指南
提示工程架构师实战手册:2025年基于最新趋势的AI项目设计指南 1. 引入与连接:从“写Prompt”到“设计提示系统”的认知跃迁 1.1 一个真实的AI项目痛点 2024年底,某头部电商公司的智能客服项目陷入瓶颈: 用户发“这件衣服洗了会缩水…...
PyTorch 2.8镜像保姆级教程:RTX 4090D下模型量化工具AutoGPTQ实操
PyTorch 2.8镜像保姆级教程:RTX 4090D下模型量化工具AutoGPTQ实操 1. 环境准备与快速部署 在开始使用AutoGPTQ进行模型量化之前,我们需要确保PyTorch 2.8镜像环境已经正确部署。本镜像专为RTX 4090D 24GB显卡优化,预装了CUDA 12.4和所有必要…...
LIBPNG深度解析:构建企业级PNG处理架构的技术决策指南
LIBPNG深度解析:构建企业级PNG处理架构的技术决策指南 【免费下载链接】libpng LIBPNG: Portable Network Graphics support, official libpng repository 项目地址: https://gitcode.com/gh_mirrors/li/libpng LIBPNG作为PNG格式的官方参考实现库࿰…...
ExcelJS 实战手册:从零构建企业级Excel报表系统
1. ExcelJS入门:为什么选择它构建企业报表? 第一次接触ExcelJS时,我正为一个电商项目头疼——每天要生成近万条订单数据的报表。尝试过直接输出CSV,但客户坚持要带格式的Excel文件;用PHPExcel处理又遇到内存溢出。直到…...
Meixiong Niannian与SpringBoot微服务架构
Meixiong Niannian与SpringBoot微服务架构 1. 引言 在当今快速发展的AI应用领域,如何将强大的画图引擎无缝集成到企业级系统中是一个关键挑战。Meixiong Niannian作为一款高性能的AI画图引擎,能够生成高质量的图像内容,而SpringBoot微服务架…...










