力扣练习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_2
        cur = head
        # 遍历链表
        while cur:
            # 如果是小于x的节点
            if cur.val < x:
                cur_1.next = cur # 将链表1的指针指针节点指向该节点
                cur_1 = cur_1.next # 移动链表1的指针节点
            else:
                cur_2.next = cur
                cur_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 = None

class 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 = next
        self.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.mfbz.cn/a/584804.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9.【Linux】(死锁问题||线程同步||条件变量||生产者消费者模型)

常见锁的概念 死锁 死锁是指在一组进程中各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用的不会释放的资源而处于一种永久等待的状态。简单来说就是两个线程都 在等待对方释放锁。 死锁必要条件 必须同时满足四个条件才会产生死锁 1.互斥条件&…

等级保护测评试题上

一、单选题 1、下列不属于网络安全测试范畴的是&#xff08;C&#xff09; A&#xff0e;结构安全 B.便捷完整性检查 C.剩余信息保护 D.网络设备防护 2、下列关于安全审计的内容说法中错误的是&#xff08;D&#xff09; A&#xff0e;应对网络系统中的网络设备运行情况、网…

陪玩线下找搭子交友小程序开源版开发

陪玩线下找搭子交友小程序开源版开发 模式是一种线上预约、线下体验的多元化社交平台。 范围广泛&#xff0c;包括电竞陪练、户外运动陪伴、音乐艺术交流、旅游伴游、生活技能指导等&#xff0c;覆盖电竞、运动、音乐、游戏、旅游、文化、艺术、学习等多个领域。 无论是亲子互…

最新游戏陪玩语音聊天系统3.0商业升级独立版本源码+搭建教程

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码。 下 载 地 址 &#xff1a; runruncode.com/php/19748.html 1. 新增人气店员轮播功能。 2. UI界面优化&#xff0c;包括游戏图标展示和分类展示的改进。 3. 增加动态礼物打赏功能。 4. 新增礼…

分布式与一致性协议之CAP和Paxos算法(一)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写&#xff0c;所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说&#xff0c;将同一业务的数据先分片&#xff0c;再以多份副本的形…

录屏功能怎么打开?这3个小技巧你得学会

当我们在使用电子设备时&#xff0c;您是否也想将屏幕上的精彩内容分享给他人&#xff0c;又或者想要记录自己的操作步骤。这时&#xff0c;录屏功能就显得尤为重要。那么&#xff0c;录屏功能怎么打开&#xff1f; 接下来&#xff0c;我将为大家详细介绍3种常见的打开录屏功能…

vue知识

一、初始vue Vue核心 Vue简介 初识 (yuque.com) 1.想让Vue工作&#xff0c;就必须创建一个Vue实例&#xff0c;且要传入一个配置对象 2.root容器里的代码依然符合html规范&#xff0c;只不过混入了一些特殊的Vue语法 3.root容器里的代码被称为【Vue模板】 4.Vue实例和容器…

关于远程桌面与3389端口的深度解析

当我们谈论远程桌面和3389端口时&#xff0c;我们实际上是在探讨Windows操作系统的一个核心功能&#xff0c;该功能允许用户通过网络从任何地点远程控制和管理计算机。而3389端口&#xff0c;正是这一功能所依赖的通信端口。 一、远程桌面的工作原理 远程桌面协议&#xff08;R…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

qt5-入门-2D绘图-基础

参考&#xff1a; QPainter_w3cschool https://www.w3cschool.cn/learnroadqt/k7zd1j4l.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 目录 基础知识penb…

场外期权交易合法吗?参与场外期权交易需要符合哪些规定?

场外期权交易是合法的金融交易方式&#xff0c;且得到了相应监管部门的支持和规范。它是一种新型的期权交易方式&#xff0c;具有灵活性高、可以满足特定投资者需求的特点。 文章来源/&#xff1a;股指研究院 场外期权是私下协商的&#xff0c;交易双方可根据个人预期、风险承…

《QT实用小工具·四十八》趣味开关

1、概述 源码放在文章末尾 该项目实现了各种样式的趣味开关&#xff1a; 1、爱心形状的switch开关&#xff0c;支持手势拖动、按压效果 2、线条样式的3种开关 项目demo演示如下所示&#xff1a; 使用方式&#xff1a; 1、sapid_switch文件夹加入工程&#xff0c;.pro文件中…

二、VLAN原理和配置

vlan不是协议&#xff0c;是一个技术&#xff0c;虚拟局域网技术&#xff0c;基于802.1q协议。 vlan&#xff08;虚拟局域网&#xff09;&#xff0c;将一个物理的局域网在逻辑上划分成多个广播域的技术。 目录 1.冲突域和广播域 概念 范围 2.以太网帧格式 3.以太网帧封装…

【小程序逆向专栏】某润选房小程序逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

【YesPMP】平台最新外包项目,设计、小程序、网站等你来接!

YesPMP平台目前最新项目&#xff0c;有感兴趣的用户&#xff0c;可查看项目参与竞标&#xff0c;免费接单&#xff0c;竞标后由项目方直接与服务商联系&#xff0c;双方直接对接。 1.查看项目&#xff1a;网站网页或pc软件 2.查看项目&#xff1a;数据 …

天冕科技亮相第十七届深圳国际金融博览会!

第十七届深圳国际金融博览会在深圳会展中心正式开幕&#xff0c;天冕科技跟随南山区组团集体亮相&#xff0c;充分展现金融活力。此次金博会&#xff0c;南山区政府共遴选了包括天冕科技在内的三家优秀金融科技企业组团参展&#xff0c;以特色与创新的案例展示了辖区金融业发展…

Ansible-Tower安装破解

主机IP地址版本Ansible192.168.169.2042.9.1Tower192.168.169.2043.6.2 基础环境 systemctl disable firewalld --now && setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config mv /etc/yum.repos.d/CentOS-* /tmp/ curl -o /etc/yum.repo…

AI时代来临,电子行业暗藏新机遇!新人如何逆袭,成为行业翘楚?

随着人工智能技术的飞速发展&#xff0c;程序员的工作正迎来前所未有的变革。去年9月&#xff0c;《大西洋月刊》上的一篇文章&#xff0c;由Kelli Mara Korducki所著&#xff0c;直言不讳地指出&#xff1a;“在人工智能时代&#xff0c;计算机科学已不再是那个稳妥的专业选择…

速成python

一个只会c的苦手来总结一下py的语法。没有其他语法基础的不建议看 1. 输入输出 print自带换行&#xff0c;可以写print("Hi", end"")取消换行 a input(你好:) # 默认是str print(type(a)) # 输出a的类型 a int(input()) # 或者a int(a) print(type(…

Vue.js 3 应用开发与核心源码解析 阅读笔记

https://www.dedao.cn/ebook/reader?idV5R16yPmaYOMqGRAv82jkX4KDe175w7xRQ0rbx6pNgznl9VZPLJQyEBodb89mqoO 2022年出的书&#xff0c;针对Vue的版本是3.2.28&#xff0c;当前的版本是 3.4.21。 本书的一大特色是对Vue 3.x的核心源码&#xff08;响应式原理、双向绑定实现、虚…
最新文章