leetcode分类刷题:链表(一、创建虚拟头节点)

1、现在再看链表问题,发现之前对傻傻分不清的cur.next有了更清晰的理解了:以cur变量表示当前节点,cur.next当前节点的指针下个节点,以上两个含义是一个意思,但在实际代码里选择其中一个进行理解会在逻辑上更清晰
2、cur.next != None出现在if或while的条件位置时,按照下个节点理解
3、cur.next = xxxxx,即cur.next放在等号左侧时,按照给当前节点的指针赋值理解
4、xxxxx = cur.next,即cur.next放在等号右侧时,按照指向或操作下个节点理解
5、本文针对的总结题型为建立虚拟头节点解决的问题,这类问题在进行对头节点的操作时,与其它节点会不一致,因此建立虚拟头节点使得所有节点的操作一致,最后返回dummyHead.next

203. 移除链表元素

链表的基本操作,删除当前节点,需要获取上个节点,因此cur指向当前节点,对下个节点cur.next进行访问和操作,此时,提前创建虚拟头节点 方便删除头节点时不用额外判断

from typing import Optional
'''
203. 移除链表元素
题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点.
示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
题眼:无。
思路:删除当前节点,需要获取上个节点,因此cur指向当前节点,对下个节点cur.next进行访问和操作,此时,提前创建虚拟头节点 方便删除头节点时不用额外判断
'''# define singly-linked list
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def removeElement(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:# 情况1、链表为空if head == None:return None# 情况2、链表非空# 思路、删除当前节点,需要获取上个节点,因此cur指向当前节点,对下个节点cur.next进行访问和操作dummyHead = ListNode()  # 虚拟头节点:方便删除头节点时不用额外判断dummyHead.next = headcur = dummyHead# 接下来的操作节点为cur.next,即当前节点的下个节点while cur.next != None:# 只有cur.next不为None时,才有属性val和nextif cur.next.val == val:cur.next = cur.next.next  # 删除操作else:  # 注意非删除操作时,才会更新cur,否则会刚好跳过刚删除节点后的节点的判断cur = cur.nexthead = dummyHead.nextreturn headif __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')nums = []if in_line[1].split('[')[1].split(']')[0] != '':nums = [int(n) for n in in_line[1].split('[')[1].split(']')[0].split(',')]val = int(in_line[2])print(nums, val)# 创建链表dummyHead = ListNode()  # 定义一个虚拟头节点cur = dummyHead  # cur用来遍历建立链表for n in nums:cur.next = ListNode(n)cur = cur.nexthead = dummyHead.nextresult = obj.removeElement(head, val)# 输出链表ans = []cur = resultwhile cur != None:ans.append(cur.val)cur = cur.nextprint(ans)except EOFError:break

24. 两两交换链表中的节点

两两交换 <=> 删除后一个节点+再插入后一个节点到前一个节点之前

from typing import Optional
'''
24. 两两交换链表中的节点
题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]
题眼:两两交换节点 + 不修改节点内部的值
思路:两两交换 <=> 删除后一个节点+再插入后一个节点到前一个节点之前
'''# define singly-linked list
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:# 情况1、链表为空或链表节点数为1,没有任何操作if head == None or head.next == None:return head# 情况2、链表节点数大于等于2dummyHead = ListNode()  # 创建虚拟头节点,使得对头节点的操作与其它节点一致dummyHead.next = headcur = dummyHeadwhile cur.next != None and cur.next.next != None:  # 参与交换的两个节点均不为空# 1、删除后一个节点temp = cur.next.next  # 标记后一个节点cur.next.next = cur.next.next.next# 2、再插入后一个节点到前一个节点之前temp.next = cur.nextcur.next = temp# 更新循环条件cur = cur.next.nextreturn dummyHead.nextif __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('[')[-1].split(']')[0]if in_line == '':head = Noneprint([])else:nums = [int(n) for n in in_line.split(',')]head = ListNode(nums[0], None)  # 创建头节点cur = headfor i in nums[1:]:  # 添加链表元素newNode = ListNode(i, None)cur.next = newNodecur = cur.next# 输出原始链表cur = headwhile cur != None:print(cur.val, end=' ')cur = cur.nextprint()# 调用函数result = obj.swapPairs(head)# 输出结果链表cur = resultwhile cur != None:print(cur.val, end=' ')cur = cur.nextprint()except EOFError:break

92. 反转链表 II

1、一次遍历,对[left, right]内的节点执行“206. 反转链表”操作,并对left节点及前一个节点标记
2、这道题不像上两个题让cur等于dummyHead进行遍历,以使得对所有节点的操作一致,而是设置pre等于dummyHead,算是达到了等价的效果,不然无法在对head有操作时最后返回dummyHead.next作为答案

from typing import Optional
'''
92. 反转链表 II
题目描述:给你单链表的头指针 head 和两个整数left 和 right ,其中left <= right 。
请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]
题眼:反转链表
思路:一次遍历,对[left, right]内的节点执行“206. 反转链表”操作,并对left节点及前一个节点标记
'''# define singly-linked list
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:# 注意链表的节点数从1开始算起dummyHead = ListNode()dummyHead.next = head  # 创建虚拟头节点,方便left=1即为头节点时 的操作 与其它节点一致pre, cur = dummyHead, head  # 类似“206. 反转链表”赋值pre为NoneleftPre, leftCur = None, None  # 对left节点及前一个节点标记for i in range(1, right + 1):if i >= left:if i == left:leftPre, leftCur = pre, cur  # 记录left前一个节点和left节点post = cur.nextcur.next = prepre, cur = cur, postelse:pre, cur = cur, cur.nextleftPre.next = pre  # 此时pre指向第right个节点leftCur.next = cur  # 此时cur指向right后一个节点return dummyHead.nextif __name__ == "__main__":while True:try:in_line = input().strip().split('=')nums = [int(n) for n in in_line[1].split('[')[1].split(']')[0].split(',')]left = int(in_line[2].split(',')[0])right = int(in_line[3])# print(nums, left, right)# 创建链表dummyHead = ListNode()cur = dummyHeadfor n in nums:cur.next = ListNode(n, None)cur = cur.nexthead = dummyHead.next# 打印链表result = headans = []cur = resultwhile cur != None:ans.append(cur.val)cur = cur.nextprint(ans)except EOFError:break

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

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

相关文章

【WINAPI】文件读写操作问题

问题描述 在利用WINAPI中的WriteFile和ReadFile函数进行文件读写操作时&#xff0c;出现无法正常读写文件报错。 分析问题 查阅WINAPI源码&#xff0c;查看参数列表各个参数的数据类型。 发现其中第二个参数&#xff0c;也就是需要写进文件的真实数据&#xff0c;其数据类型…

go http-proxy

我们这里主要讲使用HTTP&#xff0f;1.1协议中的CONNECT方法建立起来的隧道连接&#xff0c;实现的HTTP Proxy。这种代理的好处就是不用知道客户端请求的数据&#xff0c;只需要原封不动的转发就可以了&#xff0c;对于处理HTTPS的请求就非常方便了&#xff0c;不用解析他的内容…

【linux命令讲解大全】021.强大的压缩包查看工具:bzless和less的使用详解

文章目录 bzless补充说明语法参数 less补充说明语法选项参数实例 从零学 python bzless 增强.bz2压缩包查看器 补充说明 bzless命令是一个增强的.bz2压缩包查看器&#xff0c;功能比bzmore命令更加强大。 语法 bzless [文件]参数 文件&#xff1a;指定要分屏显示的.bz2压…

Bresenham 贝汉明算法

理解&#xff1a;给定两个点&#xff0c;画出两个点的连线经过的栅格。 求解思路&#xff1a; 1. bresenham贝汉明算法_Bimme军的博客-CSDN博客 2. 若干计算机图形学算法实现_JulyThirteenth的博客-CSDN博客 // grid traversal void gridTraversal(const dPoint &star…

Visual Studio软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Visual Studio是微软公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于Windows平台上的应用程序和Web应用程序的开发。以下是Visual Studio软件的主要特点和功能&#xff1a; 集成开发环境&#x…

文件夹无法删除?简单3招,轻松解决问题!

“我电脑里有一个文件夹占用了很大的内存&#xff0c;我想将它删除来释放一些内存&#xff0c;但是根本没法删除&#xff0c;为什么会这样呢&#xff1f;文件夹无法删除应该怎么办呢&#xff1f;” 在日常电脑使用中&#xff0c;有时候会遇到文件夹无法删除的情况&#xff0c;这…

IDEA如何打jar包

IntelliJ IDEA如何打jar包 1、无maven打jar包 1、编写好Java项目后&#xff0c;点击File --> Project Structure&#xff0c;然后按照以下图示步骤进行打包操作 若项目还存在一些额外的文件&#xff0c;可通过以下方式&#xff0c;将文件添加到jar包中。 //如果我们将项目…

如何在VR头显端实现低延迟的RTSP或RTMP播放

技术背景 VR&#xff08;虚拟现实技术&#xff09;给我们带来身临其境的视觉体验&#xff0c;广泛的应用于城市规划、教育培训、工业仿真、房地产、水利电力、室内设计、文旅、军事等众多领域&#xff0c;常用的行业比如&#xff1a; 教育行业&#xff1a;VR头显可以用于教育…

淘宝API技术解析,实现按图搜索淘宝商品

淘宝提供了开放平台接口&#xff08;API&#xff09;来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现&#xff1a; 1. 获取开放平台的访问权限&#xff1a;首先&#xff0c;您需要在淘宝开放平台创建一个应用&#xff0c;获取访问淘宝API的权限。具体的申请步骤和要求…

java中stream流中findFirst和findAny的区别?

在Java中&#xff0c;findFirst()和findAny()是Stream流的两个方法&#xff0c;用于获取流中的元素。它们的区别如下&#xff1a; findFirst(): findFirst()方法返回流中的第一个元素&#xff08;根据流的顺序&#xff09;。它在并行流操作中的行为更可预测&#xff0c;通常会返…

前端开发之Element Plus的分页组件el-pagination显示英文转变为中文

前言 在使用element的时候分页提示语句是中文的到了element-plus中式英文的&#xff0c;本文讲解的就是怎样将英文转变为中文 效果图 解决方案 如果你的element-plus版本为2.2.29以下的 import { createApp } from vue import App from ./App.vue import ElementPlus from …

最新本地大模型进展#Chinese-LLaMA-2支持16k长上下文

‍‍ Hi&#xff0c;今天为大家介绍最新的本地中文语言模型进展。 [2023/08/25] Chinese-LLaMA-2发布了新的更新&#xff1a; 长上下文模型Chinese-LLaMA-2-7B-16K和Chinese-LLaMA-2-13B-16K&#xff0c;支持16K上下文&#xff0c;并可通过NTK方法进一步扩展至24K。 这意味着在…

【linux】nano 快捷键

缺省Debian安装能用的编辑工具是nano&#xff0c;通过与GPT对话翻译如下快捷键功能&#xff1a; - ^X - 退出nano - ^O - 保存文件 - ^R - 插入其他文件 - ^W - 搜索字符串 - ^\ - 替换字符串 - ^K - 剪切当前行 - ^U - 粘贴已剪切内容 - ^J - 对齐当前段落 - ^T - 拼写检查 - …

设计模式二十四:访问者模式(Visitor Pattern)

用于将数据结构与数据操作分离&#xff0c;使得可以在不修改数据结构的情况下&#xff0c;定义新的操作。访问者模式的核心思想是&#xff0c;将数据结构和操作进行解耦&#xff0c;从而使得新增操作时不必修改数据结构&#xff0c;只需添加新的访问者。主要目的是在不改变数据…

uniapp 实现地图距离计算

在uniapp中实现地图距离计算可以借助第三方地图服务API来实现。以下是一种基本的实现方式&#xff1a; 注册地图服务API账号&#xff1a;你可以选择使用高德地图、百度地图等提供地图服务的厂商&#xff0c;注册一个开发者账号并获取API密钥。 安装相关插件或SDK&#xff1a;根…

Go语言入门指南:从零开始探索Go的世界

一、简介 欢迎来到Go语言入门指南。在这个博文中&#xff0c;我们将带领你了解Go语言的背景、特点&#xff0c;以及如何从头开始编写一个简单的Go程序。让我们一起探索这个简洁、高效且强大的编程语言吧&#xff01; 二、Go的历史与特点 Go&#xff0c;又称Golang&#xff0…

区块链BaaS篇

区块链BaaS&#xff08;Blockchain as a Service&#xff09;区块链即服务&#xff1b;感觉5年前做的BaaS和现在做的BaaS没啥区别&#xff0c;换了批人重复造轮子&#xff0c;BaaS做的越来越乱&#xff0c;也越来越中心化。BaaS是方便区块链调用的工具&#xff0c;工具是方便使…

人力资源小程序的设计方案与实现

随着互联网的发展&#xff0c;人才招聘已经成为许多企业的一项重要任务。为了提高招聘效率和便利求职者&#xff0c;许多企业开始采用小程序作为招聘平台。本文将为大家介绍一个搭建本地人才招聘网小程序的实用指南。 首先&#xff0c;我们需要登录【乔拓云】制作平台&#xff…

软考高级系统架构设计师系列论文七十四:基于构件的软件开发

软考高级系统架构设计师系列论文七十四:基于构件的软件开发 一、构件相关知识点二、摘要三、正文四、总结一、构件相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构

Python 面试:可变类型和不可变类型作为函数参数,关键字参数

1. 可变类型作为参数 可变对象: list/set/dict 参数会指向可变对象的副本的地址&#xff0c;每次修改的是同一个对象。 def flist(l):l.append(0)print(l)ll [] flist(ll) flist(ll)输出为&#xff1a; [0] [0, 0] # 注意&#xff1a;l只是ll的一个副本&#xff0c;修改l不…