力扣练习4.29-30

86. 分隔链表

解题思路:设置两个链表,分别装小于x和>=x的节点,最后将两个链表拼接。
步骤
1.初始化两个新链表的头结点和指针节点,初始化链表的指针节点
2.遍历变量,如果是小于x,就将第一个链表的指针节点指向该节点,并更新第一个链表的指针节点;大于等于同理;最后也要更新原始链表的指针节点
3.拼接两个链表,将第一个的尾节点指向第二个链表的头节点
4.为了防止第二个链表的尾节点指向不明确,导致可能的陷入环形结构,将其指向为空
5.返回第一个链表的头节点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:dummy_1 = ListNode(0) # 哑节点,用于存储所有小于x的节点dummy_2 = ListNode(0) # 哑节点,用于存储所有大于等于x的节点cur_1 = dummy_1 # 指针节点cur_2 = dummy_2cur = head# 遍历链表while cur:# 如果是小于x的节点if cur.val < x:cur_1.next = cur # 将链表1的指针指针节点指向该节点cur_1 = cur_1.next # 移动链表1的指针节点else:cur_2.next = curcur_2 = cur_2.next# 移动链表节点到下一个节点cur = cur.next# 链接两个链表,使用链表1的尾节点指向链表2的头结点cur_1.next = dummy_2.next# 确保大于或等于x的链表的尾部元素的next指针为None,避免循环cur_2.next = None# 返回链表1的头结点return dummy_1.next

237. 删除链表中的节点

解题思路

以往想到的删除方法就是把前驱节点的指针指向当前节点的后继节点。但是本题不提供头结点,只有要删除的节点。遍历不到前驱节点。

那就把自己当做前驱节点,删除后继节点(当做当前节点)。
具体做法是把后继节点复制到当前节点,删除后继节点即可。这样删除后的链表确实是删除了当前节点。

步骤

1.把后继节点的值复制到当前节点
2.把当前节点的指针指向后继节点的下一个节点

# 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的值为后继节点的值node.val = node.next.val# 将node的指针指向后继节点的下一个节点node.next = node.next.next# 这样使得node整个节点更新为其后继节点

138. 复制带随机指针的链表

解题思路

要求是全新的链表,如果是普通链表,直接遍历,过程中创建新节点,前驱节点指向当前节点即可。
但是本题的节点加了个随机指针,既然随机,如果在遍历过程中新增节点,随机指针没地方指啊。

因此采用哈希表+二次遍历的方法。
建立键为原链表节点,值为新链表节点的哈希表。新链表节点的随机指针取默认值。
在二次遍历的时候,根据原链表节点的随机指针指向,更新新链表节点的随机指针。

步骤

1.初始化哈希表,指针节点
2.一次遍历链表,填充哈希表
3.重置指针节点到头节点,二次遍历,修改新节点的指针和随机指针。中间要考虑到随机指针指向空,会导致字典查不到该键对应的值。
4.返回新链表的头节点(哈希表对应的旧链表的头节点的值)

"""
# Definition for a Node.
class Node:def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):self.val = int(x)self.next = nextself.random = random
"""class Solution:def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':if not head: return # 哈希表存储旧新节点的映射_dict = {}cur = head# 第一次遍历链表,构建旧新节点的映射while cur:node = Node(x=cur.val) # 构建新节点(只能建立值)_dict[cur] = node # 将旧节点作为键,新节点作为值cur = cur.next# 重置指针节点,进行第二次遍历cur = head# 构建新链表节点的指针while cur:# 构建普通指向if cur.next: # 防止字典键为空_dict[cur].next = _dict[cur.next]# 随机指针if cur.random: # 考虑到cur.random为空时,出现字典里找不到的情况_dict[cur].random = _dict[cur.random]# 移动指针cur = cur.next# 返回头节点return _dict[head]

20. 有效的括号

解题思路

有效:次数和顺序都要满足要求。
使用栈,先进后出。
遍历字符串,将开放括号入栈,遇到闭合括号的时候弹出栈顶元素,如果是满足要求的,那栈顶元素一定和闭合括号是一对。如果不是,那就直接返回false。
最后也要检查有没有足够的闭合括号,如果栈里还剩的有开放括号,那肯定也是不行的。

步骤

1.初始化栈,哈希表(开放:闭合括号),手动加上特殊字符(防止第一词遍历就遇到闭合括号,空栈弹出报错)
2.遍历字符串,遇见开放括号就入栈;遇见闭合括号就弹出栈顶元素,并进行比较,能否消消乐。
3.遍历完成后检查是否栈中还有剩余的开放括号。

class Solution:def isValid(self, s: str) -> bool:# 初始化栈,哈希表:开放:闭合括号stack = ['#']_dict = {'(': ')', '[': ']', '{': '}', '#': '#'}# 遍历,开放括号入栈,闭合括号就出栈for i in s:if i in '([{': # 入栈stack.append(i)else: # 闭合括号,弹出栈顶元素temp = stack.pop()# 检查弹出元素的对应闭合括号是不是当前遍历到的if _dict[temp] != i:return False# 为防止第一次就遇到闭合括号,导致弹出元素失败(栈为空),先加了个特殊字符# 最后判断如果都消消乐完了,就还剩个手动添加的特殊字符了return len(stack) == 1

155. 最小栈

解题思路

使用两个栈完成,一个主栈,一个辅助栈(每个阶段的最小值放在栈顶)
入栈的时候,主栈直接入;辅助栈需要判断:如果辅助栈为空,或者小于等于栈顶元素,就能入栈。
出栈的时候,主栈直接出;辅助栈依然要判断:如果主栈出的元素等于栈顶元素,那么就要出栈。
取栈顶元素和最小元素就分别取主栈和辅助栈的栈顶元素(最后一个元素)即可

步骤

1.初始化主栈和辅助栈
2.入栈:主栈直接入;辅助栈进行判断:为空或者小于等于栈顶元素。注意不要使用pop,不然就把栈顶元素弹出了,使用索引
3.出栈:主栈直接出;辅助栈判断:主栈出的元素是不是等于其栈顶元素。
4.取值,直接按索引取。

class MinStack:def __init__(self):# 初始化self.stack = []self.min_stack = []def push(self, val: int) -> None:# 主栈入栈self.stack.append(val)# 如果辅助栈为空,或者元素小于等于辅助栈栈顶元素,就入栈if not self.min_stack or val <= self.min_stack[-1]:self.min_stack.append(val)def pop(self) -> None:value = self.stack.pop()# 根据值决定是否弹出辅助栈栈顶元素if value == self.min_stack[-1]:self.min_stack.pop()def top(self) -> int:# 返回栈顶元素return self.stack[-1]def getMin(self) -> int:# 返回最小元素return self.min_stack[-1]

232. 用栈实现队列

解题思路

队列先进先出,栈先进后出。为了用栈实现队列,就要对主栈进行逆序。这样第一个元素就能被辅助栈(逆序)弹出。

步骤

1.初始化主栈和辅助栈
2.入队:仅将元素入主栈即可。如果在这个时候将主栈元素弹出移动到辅助栈,那辅助栈的元素顺序不会发生变化
3.弹出队首元素:检查辅助栈是否为空,如果为空,就将主栈元素依次弹出并入辅助栈。辅助栈得到了逆序的队列,弹出栈顶元素,即为队首元素。
4.取出队首元素:同上。但是不弹出,是取出,[-1]
5.检查队列是否为空:为空则主栈为空,且辅助栈也为空。

class MyQueue:def __init__(self):self.in_stack = []self.out_stack = []def push(self, x: int) -> None:# 入栈self.in_stack.append(x)def pop(self) -> int:# 弹出队首元素# 也就是弹出入栈的第一个元素,将主栈的元素依次弹出,加入到辅助栈,这样就实现了逆序if not self.out_stack:while self.in_stack:self.out_stack.append(self.in_stack.pop())# 返回队首元素return self.out_stack.pop()def peek(self) -> int:# 同理,获取队首元素,不弹出if not self.out_stack:while self.in_stack:self.out_stack.append(self.in_stack.pop())return self.out_stack[-1]def empty(self) -> bool:# 检测是否为空,是要看两个栈是否都空了return not self.out_stack and not self.in_stack

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

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

相关文章

深入浅出TCP 与 UDP

&#x1f525; 引言 在互联网的广阔天地里&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;作为传输层的两大支柱&#xff0c;各自承担着不同的使命。下面这篇文章将带你从基础到进阶&#xff0c;全…

什么是 Java 集合,Java 集合有几类?

Java集合&#xff08;Java Collections&#xff09;是Java编程语言中一组用于存储和操作数据的框架。它提供了一种便捷的方式来管理和操作数据集合&#xff0c;无论是数组还是其他数据结构。Java集合框架被设计为通用的、可扩展的&#xff0c;并且具有高性能。它为开发人员提供…

a-table导出excel.xlsx文件,含合并表头处理

1、安装 npm install xlsx // 0.15.62、封装tableExport.js import {utils, writeFile } from xlsxexport function tableExport(tableDom, name) {const dom = document.querySelector(.ant-table-fixed-left);const parentDom = dom.parentNodeparentDom?.removeChild(d…

Windows如何启动和停止etw事件监听

Windows如何启动和停止etw事件监听 关于Etw ETW是Event Tracing for Windows的简称&#xff0c;它是Windows提供的原生的事件跟踪日志系统。由于采用内核&#xff08;Kernel&#xff09;层面的缓冲和日志记录机制&#xff0c;所以ETW提供了一种非常高效的事件跟踪日志解决方案…

查表法处理sin,cos,tan函数-360到360度的值

1、把处理函数放到sincostan.h头文件中 /*********************************公式计算********************************/ /* 1.诱导公式 sin(-a)-sin(a) cos(-a)cos(a) sin(π2-a)cos(a) cos(π2-a)sin(a) sin(π2a)cos(a) cos(π2a)-sin(a) sin(π-a)sin(a) cos(π-a)-cos(a)…

解决Linux CentOS 7安装了vim编辑器却vim编辑器不起作用、无任何反应

文章目录 前言一、解决vim不起作用&#xff08;卸载重新安装&#xff09;1.重新安装vim2.测试vim是否能正常使用 二、解决vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short报错三、解决vim编辑器不能使用方向键和退格键问题 remove vim-common …

线上线下收银一体化,新零售POS系统引领连锁门店数字化转型-亿发

在市场竞争日益激烈的背景下&#xff0c;没有哪个商家能够永远屹立不倒。随着互联网技术的快速发展&#xff0c;传统的线下门店面临着来自电商和新零售的新型挑战。实体零售和传统电商都需要进行变革&#xff0c;都需要实现线上线下的融合。 传统零售在客户消费之后就与商家失…

Java 为什么设计成 “String” 不能用 “==” 比较值?

Java中的String是一种特殊的对象类型&#xff0c;用于表示字符串。在Java中&#xff0c;String对象的创建和比较是一个重要的话题&#xff0c;其中&#xff0c;操作符在比较String对象时有着特殊的行为。为了了解Java为什么设计成String不能用比较值&#xff0c;需要深入探讨Ja…

数据结构八:线性表之循环队列的设计

上篇博客&#xff0c;学习了栈&#xff0c;我们可以知道他也是一种线性表&#xff0c;遵从先进后出的原则&#xff0c;在本节&#xff0c;我们进一步学习另一种线性表—队列。就像饭堂里排队打饭的的队伍&#xff0c;作为一种先进先出的线性表&#xff0c;他又有哪些特别之处呢…

公网ip申请ssl仅260

现在很多网站都已经绑定域名&#xff0c;因此使用的都是域名SSL证书保护网站传输信息安全&#xff0c;而没有绑定域名只有公网IP地址的网站想要保护传输信息安全就要申请IP SSL证书。IP SSL证书也是由正规CA认证机构颁发的数字证书&#xff0c;用来保护用户的隐私以及数据安全&…

FLUKE万用表17B+的电压档最大内阻

项目中遇到一个测量兆欧级别电阻两端电压的问题&#xff0c;发现按照上图中的电路搭建出来的电路测得的电压为8.25V左右&#xff0c;按理说应为9V才对&#xff0c;后来想到万用表测量电压档不同的档位会有不同内阻&#xff0c;测量的电阻应远小于万用表电压档内阻才有效。本次测…

Creo Assembly “Save As“时,为什么关联的Drawing无法Save As

问题描述&#xff1a; Creo Assembly 进行“另存为”&#xff0c;勾选了“Copy Drawings”。但操作结果是&#xff0c;该Assembly相关联的Drawing没有被“另存为”。 原因分析&#xff1a; 查看Workspace&#xff0c;发现该Assembly a.asm相关联的Drawing为b.drw&#xff0…

【软测学习笔记】Linux入门Day02

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;软件测试笔记 &#x1f4da;参考教程&#xff1a;黑马教程❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 1、history 查看历史命令 2、ln 链接 3、grep 查找文件内容 4、find …

帕金森患者锻炼的小妙招

亲爱的读者朋友们&#xff0c;大家好&#xff01;在这个阳光明媚的一天&#xff0c;我们要和大家分享一份特别的健康礼赞——专为帕金森患者量身定制的锻炼方案。让我们一起走进帕金森患者的世界&#xff0c;了解他们如何通过科学的锻炼方法&#xff0c;改善身体状况&#xff0…

【前端】表格合并如何实现?

简言 介绍实现表格合并的一种方法。 表格合并 表格合并操作是一个比较复杂的操作&#xff0c;它主要分为以下步骤&#xff1a; 获取选中区域选择合并显示的单元格实现合并操作。 我们就逐一实现这三步&#xff0c;最后实现一个较完整的合并操作。&#xff08;不考虑边界情…

区块链交易所开发

在当今数字化时代&#xff0c;区块链技术以其独特的去中心化、安全性和透明性&#xff0c;正在逐步改变我们的生活。其中&#xff0c;区块链交易所作为连接区块链技术与广大投资者的桥梁&#xff0c;其开发与发展备受关注。本文将从技术进步与市场需求两个维度&#xff0c;探讨…

【Jenkins】持续集成与交付 (八):Jenkins凭证管理(实现使用 SSH 、HTTP克隆Gitlab代码)

🟣【Jenkins】持续集成与交付 (八):Jenkins凭证管理(实现使用 SSH 、HTTP克隆Gitlab代码) 1、安装Credentials Binding、git插件2、凭证类型及用途3、(用户名和密码类型)凭证的添加和使用3.1 用户密码类型3.2 测试凭证是否可用3.3 开始构建项目3.3 查看结果(进入Jenk…

mySQL商城项目实战 (终)(全部表)(1-88张)

本章无sql语句&#xff0c;直接放转出的sql文件。 88张表结果如图! 资源在已经与文章绑定&#xff0c; 在navicat工具中&#xff0c;执行以下步骤 在新建的数据库中右键,点击【运行sql文件】&#xff0c;运行绑定的资源&#xff0c;之后您就可以在您的navicat中看到我建好的8…

Django orm高级用法以及查询优化

基础查询 #全表查询 Author.objects.all() #<QuerySet [<Author: Author object (4)>, <Author: Author object (1)>, <Author: Author object (10)>, <Author: Author object (8)>, <Author: Author object (5)>, <Author: Author objec…

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通&#xff08;08&#xff09;——对标尚硅谷Kafka教程 5. Kafka优化5.1 资源配置5.1.1 操作系统5.1.2 磁盘选择5.1.3 网络带宽5.1.4 内存配置5.1.5 CPU选择 5.2 集群容错5.2.1 副本分配策略5.2.2 故障转移方案5.2.3 数据备份与恢复 5.3 参数配置优化5.4 数…