当前位置: 首页 > news >正文

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点

目录

一.【Leetcode203】移除链表元素

1.链接

2.题目再现

 A.双指针法

B.类尾删法

C.哨兵位

二.【Leetcode876】链表的中间节点

1.链接:链表的中间节点

2.题目再现

3.解法:快慢指针

三.链表中倒数第k个节点

1.链接:链表中倒数第k个节点

2.题目再现

3.解法 :快慢指针


一.【Leetcode203】移除链表元素

1.链接

移除链表元素

2.题目再现

 A.双指针法

1.创建一个指针 cur=head  和一个指针  pre=NULL;  

2.用cur->val 与 val 比较,如果不相等则把 cur 赋给 pre 使cur 指向下一个节点,即

   cur=cur->next

3.如果相等则使 pre 的 next 指向 cur 的 next ,即:

 pre->next=cur->next ,然后再 free 掉 cur ,最后再使 cur 等于 pre 的 next,注意在进行这些步骤之前要判断 pre 是否为空 ,若为空即为头删;

演示:

双指针

代码:

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

B.类尾删法

1.创建一个新的指针newhead ,同时为了省去找尾的麻烦,我们可以定义一个尾指针 tail 来保存尾节点;

2.再创建一个指针 cur =head ,用来遍历链表;

3.如果 cur->val != val ,则尾插 ,注意要判断 tail 是否为空 ,类似于单链表的尾插那部分,如果不理解的话,可查看文章 :单链表的增删查改;

4.如果 cur->val ==val,则 cur=cur->next ;

5.最后要将尾节点置空。

演示:

类尾插

代码:

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

C.哨兵位

1.malloc 一个哨兵位节点 dummyhead,使其 next 指向 head ;

2.再定义一个节点 tmp = dummyhead ,用这个遍历链表;

3.注意因为 tmp ->next 才是 head ,所以 while 里要写 tmp->next !=NULL

演示:

移除链表元素 哨兵位法动态演示

代码:

struct ListNode* removeElements(struct ListNode* head, int val) 
{struct ListNode*dummyhead=(struct ListNode*)malloc(sizeof(struct ListNode));dummyhead->next=head;struct ListNode*tmp=dummyhead;while(tmp->next!=NULL){if(tmp->next->val==val){tmp->next=tmp->next->next;}else {tmp=tmp->next;}}return dummyhead->next;
}

二.【Leetcode876】链表的中间节点

1.链接:链表的中间节点

2.题目再现

3.解法:快慢指针

1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head;

2.遍历链表,快指针一次走2步,慢指针一次走1步 ;

3.注意:因为链表的长度可能是单数也可能是双数,所以当我们已 fast 是否为NULL 作为循环控制条件的话,要在 fast 走2步前判断 fast->next 是否为空

4.最后慢指针就是中间节点

演示:

链表中间节点 快慢指针动态演示

代码:

struct ListNode* middleNode(struct ListNode* head)
{struct ListNode*slow=head;struct ListNode*fast=head;while(fast){if(fast->next==NULL)  //注意判断{break;}else{fast=fast->next->next;  //fast 走2步}slow=slow->next;   //slow 走1步}return slow;  //返回慢指针
}

三.链表中倒数第k个节点

1.链接:链表中倒数第k个节点

2.题目再现

3.解法 :快慢指针

1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head;

2.因为倒数第k个节点和尾节点的差为 k-1  ,所以我们先让快指针先走 k-1 步;

或者因为尾节点所指向的NULL 和倒数第k个节点相差k,也可以先让快指针走k步;

这个时候慢指针不动;

3.快指针走完后,快指针和慢指针依次走,每次只走1步

注意,如果是k-1,那么遍历结束的条件是fast->next 是否为空 ,如果是k,那么遍历结束的条件是fast 是否为空;

4.返回慢指针。

演示:

链表倒数第K个节点 快慢指针动态演示

代码:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{if(pListHead==NULL){return NULL;}struct ListNode*slow=pListHead;struct ListNode*fast=pListHead;while(k--)  //这里以先走k步为例{if(fast==NULL){return NULL;}fast=fast->next;}while(fast){slow=slow->next;fast=fast->next;}return slow;
}

😽本篇文章到此就结束了,若有错误或是建议,欢迎小伙伴们指出;😻

😍请多多支持博主哦~🥰

🤩谢谢你的阅读~😃

相关文章:

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点

目录 一.【Leetcode203】移除链表元素 1.链接 2.题目再现 A.双指针法 B.类尾删法 C.哨兵位 二.【Leetcode876】链表的中间节点 1.链接:链表的中间节点 2.题目再现 3.解法:快慢指针 三.链表中倒数第k个节点 1.链接:链表中倒数第k个…...

快速上手配置firewalld

firewalld使用firewall-cmd命令配置策略。 查看当前firewalld当前服务运行状态 firewall-cmd --state firewalld防火墙状态还用使用如下命令查看状态 systemctl status firewalld 查看所有打开运行的端口 firewall-cmd --zonepublic --list-ports 查看区域信息情况 firewall…...

treap使用mt19937会导致问题原因分析

Treap 是一种使用随机数生成器来维护树形结构的数据结构,而 mt19937 是一种常用的伪随机数生成器。虽然 mt19937 可以生成高质量的随机数序列,但是在 Treap 中使用它可能会导致一些问题。 mt19937 返回的是一个 unsigned int 其中一个问题是&#xff0…...

tmux和vim

tmux 作用 分屏 允许断开Terminal连接后继续运行进程 结构 一个tmux可以开一堆session tmux: session 1, session 2, session 3 … Session: window 1, window 2, window 3… Window: pane 1, pane 2, pane 3… pane是最小单位,用shell语言编程 操作 输入…...

2023年全国最新保安员精选真题及答案12

百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 121.《保安员证》是经由设区的()单位进行发放。 A:市级人民政…...

Hbase的基本概念与架构

一、Hbase的概念 HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候,请考虑使用H…...

颠覆你的认知,业务同事都能开发软件,我简直无地自容……

经常看到网络鼓吹业务人员也能搭建应用,本是嗤之以鼻、半信半疑,但当这件事真实发生在自己身上时,竟觉得此言不虚? 一、背景 最近公司为了集成系统、提升扩展能力,引进了低代码平台JNPF,说个题外话&#…...

01 | n2n虚拟局域网

1 n2n简介 为了满足两个不同局域网的机器进行通信,让不同网段的机器能够进行P2P( 点对点 peer-to-peer ) 通信。2 n2n源码 https://github.com/ntop/n2n.git3 n2n名词 3.1 SuperNode 超级节点 SuperNode 相当与注册中心, 它会记录边缘节点的连接信息,…...

MFC界面控件BCGControlBar v33.4 - 支持Win 11 Mica material主题

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了,该版本包含了对Windows 11 Mica materia…...

手把手教你用js实现手机通讯录功能(附源码)

js实现手机通讯录效果图需求需求一:锚点通过#id配合a标签使用css中scroll-behavior属性的使用需求二需求三获取汉字拼音的首字母方法1:使用插件,这里推荐pinyin-pro方法2:使用unicode去重数组中冗余的对象法一:用Map去…...

【C/C++】逗号表达式、算术运算符优先级

一、逗号表达式 1、如下图中代码,为变量d赋值,d的值为逗号表达式中的哪一个呢? 运行结果:d的值为6 2、再举个例子 运行结果:d的结果还是6 3、再举个例子 运行结果 以上面三种不同的逗号表达式为例,…...

携禾生物面试总结

面试时间: 2022年2月3日 1.项目C11的特性具体有用到哪些? 智能指针 lambda表达式 auto unordered_map 2.智能指针用到了哪几种智能指针 3.shared_ptr和weak_ptr区别 4.多线程实现方式 prosix线程》pthread windows的_beginthreaex MFC多线程 ACEM中…...

FPGA纯verilog手写HDMI发送IP 提供源码和技术支持

目录1、前言2、设计思路和框架TMDS 编码算法OSERDESE串并转换3、顶层源码和IP封装4、源码和IP获取1、前言 本设计使用Xilinx原语和自己手写的代码实现了HDMI发送功能,纯verilog手写,有源码,也提供封装好的IP,你喜欢用例化的方式就…...

【知识点】OkHttp 原理 8 连问

前言OkHttp可以说是Android开发中最常见的网络请求框架,OkHttp使用方便,扩展性强,功能强大,OKHttp源码与原理也是面试中的常客但是OKHttp的源码内容比较多,想要学习它的源码往往千头万绪,一时抓不住重点.本文从几个问题…...

【python】深入了解Selenium-PageObject

1、PageObject 定义 Page Object(简称PO)模式,是Selenium实战中最为流行,并且是自动化测试中最为熟悉和推崇的一种设计模式。在设计自动化测试时,把页面元素和元素的操作方法按照页面抽象出来,分离成一定的对象,然后再…...

PAT——7-4 简易测谎 (20 分)

测谎通常使用一套准备好的问题提问被测试者,通过分析被测试者的反应得到结果。比较高级的测谎技术会使用测谎仪,监视被测试者的生理活动状况。我们这里的简易测谎则是通过对问题答案的特征分析来做出判断。 首先我们要求被测试者做完 N 道单选题&#x…...

【力扣】 面试题 05.02.二进制数转字符串(超过c++100%)

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。示例1:输入:0.625输出:"0.10…...

软件质量保证与测试 课堂笔记

...

Costco好市多验厂百问百答

【Costco好市多验厂百问百答】美国仓储式超市Costco,中文好市多,近几年发展势头迅猛,大有赶超传统商超巨头沃尔玛之势。之前有出口企业反馈,Costco采购不仅量大,而且价格好,所以Costco成为国内出口企业纷纷…...

Nginx 通过 header 中的标识进行分发

Nginx可以根据请求头中自定义的标识将请求分发到不同的服务器。具体来说,可以使用map指令将请求头中的自定义标识映射为不同的后端服务器地址,然后使用proxy_pass指令将请求转发到对应的后端服务器。 以下是一个示例配置文件: http {map $h…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...