【链表】【删除节点】【刷题笔记】【灵神题单】
237.删除链表的节点
链表删除节点的本质是不用删除,只需要操作指针,跳过需要删除的节点,指向下下一个节点即可!
- 删除某个节点,但是不知道这个节点的前一个节点,也不知道头节点!
- 摘自力扣评论区:如何让自己在世界上完全消失,但是又不死?将自己变成另一个人,再杀了那个人!
- 将node.next的值赋给node
- 再将node连接到node.next的next!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def deleteNode(self, node):""":type node: ListNode:rtype: void Do not return anything, modify node in-place instead."""node.val = node.next.val node.next = node.next.next
什么时候需要创建哨兵节点dummy node?
一般来说,如果需要删除头节点,是需要dummy node作为辅助的!
19.删除倒数第N个节点
- 这道题需不需要创建dummy node?
- 如果n等于链表长度,那么n是会被删除的,所以需要!
常规思路:找到正数第几个
- 先遍历一遍链表,计算链表长度n
- 这样就知道倒数第N个节点,是正数的第n-N+1个
- 将第n-N节点指针,指向n-N+2即可!
实现过程中有许多问题,实现起来有点缝缝补补的意思!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = nextclass Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:if n == 0:return headcnt = 0cur = head # 指向头节点while cur:cnt += 1cur = cur.next# 处理n等于链表长度的情况,即要删除头节点if n == cnt:return head.nextc = cnt - ncur = headwhile c-1 > 0: # 走cnt - n步,走到要删除节点的前一个节点cur = cur.nextc -= 1if cur.next:cur.next = cur.next.nextreturn head————————————————————————————通过
妙解:前后指针
- 已知要删除倒数第N个节点
- 初始化前指针,先走N步
- 然后初始化后指针,一起向后走
- 前后指针距离始终是N
- 当前指针走到了最后一个,倒数第一个,则后指针就恰好走到了倒数第N+1个节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = nextclass Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:# 由于有可能需要删除倒数第n个,即开头节点,所以创建dummynodedummy = ListNode(0)dummy.next = head# 链表中用指针表示位置,跟数组的指针之间用索引不同# 所以定义右指针指向dummyright = dummy# 向右走n步for _ in range(n):right = right.next# 左指针也指向dummyleft = dummy# 一起向后走,直到右指针走到头while right.next: # 不是right,而是right.next,才是right走到倒数第一个right = right.nextleft = left.next# 开始,正数 左=1,右=n。结束:右=倒数第1,左=倒数第一(N)# 反正此时,左=要删除的节点的上一个节点!left.next = left.next.nextreturn head
————————————————————————
解答错误
177 / 208 个通过的测试用例官方题解
输入
head =
[1]
n =
1添加到测试用例
输出
[1]
预期结果
[]
注意不是返回head,而是dummy.next
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:# 由于有可能需要删除倒数第n个,即开头节点,所以创建dummynodedummy = ListNode(0)dummy.next = head# 链表中用指针表示位置,跟数组的指针之间用索引不同# 所以定义右指针指向dummyright = dummy# 向右走n步for _ in range(n):right = right.next# 左指针也指向dummyleft = dummy# 一起向后走,直到右指针走到头while right.next: # 不是right,而是right.next,才是right走到倒数第一个right = right.nextleft = left.next# 开始,正数 左=1,右=n。结束:右=倒数第1,左=倒数第一(N)# 反正此时,左=要删除的节点的上一个节点!left.next = left.next.nextreturn dummy.next
删除排序链表中的重复元素
- 基本思路很简单,逐渐遍历链表,要么删除元素,要么之间向后移动!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:dummy = ListNode(None)dummy.next = headslow = headwhile slow:# 确保 fast 和 fast.next 不为 Noneif slow.next:fast = slow.nextelse:breakwhile fast and fast.val == slow.val:fast = fast.nextslow.next = fastslow = slow.nextreturn dummy.next
- 真的必须用到dummynode么?
- 有可能删除开头节点,才必须用dummynode,这里可以规避掉删开头节点这个问题!
- 只用一个cur指针可以完成任务
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:cur = headwhile cur.next:if cur.val == cur.next.val:cur.next = cur.next.nextelse:cur = cur.nextreturn head
______________
执行出错
2 / 168 个通过的测试用例
AttributeError: 'NoneType' object has no attribute 'next'^^^^^^^^while cur.next:
Line 9 in deleteDuplicates (Solution.py)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ret = Solution().deleteDuplicates(param_1)
Line 43 in _driver (Solution.py)_driver()
Line 58 in <module> (Solution.py)
提示,没处理空节点情况!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:if not head:return Nonecur = headwhile cur.next:if cur.val == cur.next.val:cur.next = cur.next.nextelse:cur = cur.nextreturn head
____________________
通过
这道题是删除掉重复的节点,只保留一个
下道题:如果链表有重复节点,全部删除,只保留原本就不存在重复节点的节点!
这道题很简单,实现起来也应该很简单,但我实在太菜…写了好久,没写对,最后看了答案
暂时没心情复盘,复习的时候注意!翻看力扣提交记录!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:# 重复节点可能出现在开头,开头head有可能被删除# 所以定义dummynodedummy = ListNode(None)dummy.next = headcur = dummywhile cur.next and cur.next.next : # 要的是val = cur.next.val # 记下下一个节点值if cur.next.next.val == val: # 如果下下个节点值等于val# 套一个循环,只要当前节点的下一个节点值等于val,就cur.next= cur.n.n,来删掉下一个节点while cur.next and cur.next.val == val :cur.next = cur.next.nextelse: # cur的n和nn不相等——>cur走一步cur = cur.nextreturn dummy.next
相关文章:
【链表】【删除节点】【刷题笔记】【灵神题单】
237.删除链表的节点 链表删除节点的本质是不用删除,只需要操作指针,跳过需要删除的节点,指向下下一个节点即可! 删除某个节点,但是不知道这个节点的前一个节点,也不知道头节点!摘自力扣评论区…...

springboot339javaweb的新能源充电系统pf(论文+源码)_kaic
毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…...

【嵌入式——QT】QT制作安装包
第一步 QT程序写好之后,编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令,回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...
python的文件操作练习
文件操作:成绩统计 有一个文件grades.txt,文件内容是每行一个学生的成绩(格式:姓名,成绩)。要求: 读取文件内容,统计所有学生的平均成绩; 将不及格(<60分)…...

jQuery九宫格抽奖,php处理抽奖信息
功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项,用户点击抽奖按钮后,九宫格开始旋转,最终停在一个随机位置上,此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为…...

2024年一级建造师考试成绩,即将公布!
一级建造师考试成绩一般在考试结束后3个月左右的时间公布! 根据官方通知,重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到:2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...

M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?
M4V 是一种视频文件格式,主要由苹果公司用于其产品和服务中,如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容,并且通常与苹果的 DRM(数字版权管理)技术结合使用,以限制内容的复制和…...

Leetcode 每日一题 104.二叉树的最大深度
目录 问题描述 示例 示例 1: 示例 2: 约束条件 题解 方法一:广度优先搜索(BFS) 步骤 代码实现 方法二:递归 步骤 代码实现 结论 问题描述 给定一个二叉树 root,我们需要返回其最大…...

文件上传漏洞:你的网站安全吗?
文章目录 文件上传漏洞攻击方式:0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...

AWS账号提额
Lightsail提额 控制台右上角,用户名点开,选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...

电子应用设计方案-29:智能云炒菜系统方案设计
智能云炒菜系统方案设计 一、系统概述 本智能云炒菜系统旨在为用户提供便捷、高效、个性化的烹饪体验,结合云技术实现远程控制、食谱分享、智能烹饪流程优化等功能。 二、系统组成 1. 炒菜锅主体 - 高品质不粘锅内胆,易于清洁和维护。 - 加热装置&#x…...
腾讯rapidJson使用例子
只需要把库的头文件拿下来加入项目中使用就行,我是以二进制文件存储内容并解析: #include <iostream> #include <fstream> #include <string> #include "rapidjson/document.h" #include "rapidjson/error/en.h"…...
UE5_CommonUI简单使用(2)
上篇我是简单写了一下CommonUI使用的初始设置以及Common Activatable Widget和Common Activatable Widget Stack以及Common 控件Style以及鼠标控制的一些内容,这些对于了解UMG的朋友来说没什么难度,唯一需要注意的就是Common Activatable Widget Stack堆栈管理只能是用来管理…...

探讨播客的生态系统
最近对播客发生了兴趣,从而引起了对播客背后的技术,生态的关注。本文谈谈播客背后的技术生态系统。 播客很简单 播客(podcast)本质上就是以语音的方式发布信息。它和博客非常类似。如果将CSDN 网站上的文字加一个语音播报。CSDN …...

淘宝架构演化
基本功能 LAMP(LinuxApacheMySQLPHP)标准架构,初期采用拿来主义,只具备基本功能。 数据库:读写分离,MyISAM存储引擎 2003年5月—2004年1月 存储瓶颈 mysql达到访问瓶颈,升级成oracle&#x…...

软通动力携子公司鸿湖万联、软通教育助阵首届鸿蒙生态大会成功举办
11月23日中国深圳,首届鸿蒙生态大会上,软通动力及软通动力子公司鸿湖万联作为全球智慧物联网联盟(GIIC)理事单位、鸿蒙生态服务(深圳)有限公司战略合作伙伴,联合软通教育深度参与了大会多项重磅…...

【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 文章目录 💯前言💯DALLE 3 图像生成介绍(Introduction to DALLE 3 Image Generation)图像质量与分辨率图像生成机制的解析多图生成功能 💯使用 DALLE…...

【数据事务】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

深入解析下oracle char和varchar2底层存储方式
oracle数据库中,char和varchar2数据类型用来存储字符数据。char类型一旦定义多大,那么它就分配多少字节空间;varchar2类型定义多大,代表它可以扩展的最大大小为多大,一开始空间根据使用来决定。字符数据存储在oracle表…...

Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧
Angular在其最新版本 v19 中引入了增量水合(Incremental Hydration)这一特性。这一更新引发了开发者们广泛的讨论,特别是在优化首屏加载速度和改善用户体验方面。本文将详解水合过程的概念、增量水合的应用场景,以及它与类似框架如…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...