【链表】【删除节点】【刷题笔记】【灵神题单】

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

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

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

相关文章

python基础(五)

正则表达式 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说&#xff0c;正则表达式就是记录文本规则的代码。 符号解释示例说明.匹配任意字符b.t可以匹配bat / but / b#t / b1t等\…

高级java每日一道面试题-2024年11月29日-JVM篇-常见调优工具有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: 常见调优工具有哪些? 我回答: 在Java高级面试中&#xff0c;调优是一个非常重要的主题。掌握一些常用的调优工具可以帮助开发者有效地分析和解决性能问题。下面是一些常见的Java调优工具及其详细说明&#xff1a; 1. JVM自带工具…

电机瞬态分析基础(7):坐标变换(3)αβ0变换,dq0变换

1. 三相静止坐标系与两相静止坐标系的坐标变换―αβ0坐标变换 若上述x、y坐标系在空间静止不动&#xff0c;且x轴与A轴重合&#xff0c;即&#xff0c;如图1所示&#xff0c;则为两相静止坐标系&#xff0c;常称为坐标系&#xff0c;考虑到零轴分量&#xff0c;也称为αβ0坐标…

Mac 环境下类Xshell 的客户端介绍

在 Mac 环境下&#xff0c;类似于 Windows 环境中 Xshell 用于访问 Linux 服务器的工具主要有以下几种&#xff1a; SecureCRT&#xff1a; 官网地址&#xff1a;https://www.vandyke.com/products/securecrt/介绍&#xff1a;支持多种协议&#xff0c;如 SSH1、SSH2、Telnet 等…

Java 泛型详细解析

泛型的定义 泛型类的定义 下面定义了一个泛型类 Pair&#xff0c;它有一个泛型参数 T。 public class Pair<T> {private T start;private T end; }实际使用的时候就可以给这个 T 指定任何实际的类型&#xff0c;比如下面所示&#xff0c;就指定了实际类型为 LocalDate…

D81【 python 接口自动化学习】- python基础之HTTP

day81 requests请求session用法 学习日期&#xff1a;20241127 学习目标&#xff1a;http定义及实战 -- requests请求session用法 学习笔记&#xff1a; requests请求session用法 import requests# 创建一个会话 reqrequests.session() url "http://sellshop.5istud…

arkTS:持久化储存UI状态的基本用法(PersistentStorage)

arkUI&#xff1a;持久化储存UI状态的基本用法&#xff08;PersistentStorage&#xff09; 1 主要内容说明2 例子2.1 持久化储存UI状态的基本用法&#xff08;PersistentStorage&#xff09;2.1.1 源码1的相关说明2.1.1.1 数据存储2.1.1.2 数据读取2.1.1.3 动态更新2.1.1.4 显示…

OSPTrack:一个包含多个生态系统中软件包执行时生成的静态和动态特征的标记数据集,用于识别开源软件中的恶意行为。

2024-11-22 &#xff0c;由格拉斯哥大学创建的OSPTrack数据集&#xff0c;目的是通过捕获在隔离环境中执行包和库时生成的特征&#xff0c;包括静态和动态特征&#xff0c;来识别开源软件&#xff08;OSS&#xff09;中的恶意指标&#xff0c;特别是在源代码访问受限时&#xf…

UDP客户端服务器通信

在这篇博客中&#xff0c;我们将探索 UDP&#xff08;用户数据报协议&#xff09; 通信&#xff0c;简要地说&#xff0c;UDP 是一种无连接、快速但不可靠的通信协议&#xff0c;适用于需要快速数据传输但对丢包容忍的场景&#xff0c;比如视频流和在线游戏。就像《我是如此相信…

关于使用注册表修改键盘的键位映射

修改注册表实现键盘的键位映射 前言一、scancode是什么&#xff1f;二、步骤1.打开注册表2.scancode表 总结 前言 弄了个蓝牙的欧洲键盘&#xff0c;但左上角居然是WWW home键&#xff0c;还找不到Esc键&#xff0c;崩溃了&#xff0c;VI都用不了。 赶紧考虑键位映射&#xff…

Unreal Engine使用Groom 打包后报错

Unreal Engine使用Groom打包后报错 版本5.4.4 blender 4.2.1 项目头发用了groom&#xff0c;运行后报错 错误&#xff1a; Assertion failed: Offset BytesToRead < UncompressedFileSize && Offset > 0 [File:E:\UnrealEngine-5.4.4-release\Engine\Source\R…

python之Flask入门—路由参数

语法&#xff1a; /routerName/<string:parameter_name> 其中&#xff1a;routerName代表路由名称<>中的string是参数类型&#xff0c;parameter_name为参数名称 参数类型&#xff1a; &#xff08;1&#xff09; string 接收任何没有斜杠&#xff08;/&#x…

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…

ffmpeg 增亮 docker 使用

使用最新的 docker pull jrottenberg/ffmpeg docker run -it --rm -v /path/to/input:/input -v /path/to/output:/output jrottenberg/ffmpeg <ffmpeg command>比如我想增亮 在 /home 目录下 有一个 video.mp4 docker run --rm -v /home:/home jrottenberg/ffmpeg:7…

小白可以报名鸿蒙开发培训吗

随着科技的飞速发展&#xff0c;尤其是移动互联网和智能硬件的不断进步&#xff0c;各大科技公司纷纷推出了自家的操作系统&#xff0c;而华为的鸿蒙系统(HarmonyOS)无疑成为了其中的佼佼者。随着鸿蒙系统的逐步推广&#xff0c;越来越多的开发者开始关注这一新的开发平台。那么…

flink1.6集成doris,并从mysql同步数据到doris

使用 Apache Flink 1.6 集成 Doris&#xff0c;并从 MySQL 同步数据到 Doris 是一个复杂的任务&#xff0c;但可以通过以下步骤实现。Doris 是一个现代化的 MPP&#xff08;大规模并行处理&#xff09;SQL 数据库&#xff0c;支持实时分析和交互式查询。Flink 可以作为实时数据…

Figma入门-原型交互

Figma入门-原型交互 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的&#xff0c;对…

蓝牙循环搜索并连接. Android辅助功能以及锁的灵活运用

生产上遇到个问题, 某些蓝牙模块不能在低温下进行连接, 所以需要实现个工具 , 一次性自动检测150个蓝牙, 那么android设备就要不断自动的去搜索附近蓝牙模块,然后进行配对,再进行连接,连接成功后断开,去下一个蓝牙模块进行配对连接, 直到搜索出来的蓝牙都配对连接完毕. 根据测…

Linux内核机制自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;先搬移过来&#xff0c;也不知道到底是对是错了。 1、Linux内存管理 在计算机的世界&#xff0c;内存犹如一条长河&#xff0c;在这条长河中&#xff0c;cpu将这条长河划分成了段和页。cpu要将一…

oracle日期格式查询

文章目录 TO_CHARyyyy-MM-ddyyyy-MM-dd HH24:MI:SS TO_CHAR 在Oracle数据库中&#xff0c;可以使用TO_CHAR函数来格式化日期。TO_CHAR函数可以将DATE或TIMESTAMP数据类型转换为字符串&#xff0c;并按照指定的格式显示。 yyyy-MM-dd 以下是一个简单的例子&#xff0c;假设我…