力扣hot100题解(python版29-32题)

29、删除链表的倒数第N个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

img

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

思路解答:

  1. 使用两个指针 fastslow,初始时都指向头节点。
  2. fast 先向前移动 n+1 步,这样 fastslow 之间相隔 n 个节点。
  3. 接着同时移动 fastslow,直到 fast 到达链表末尾,此时 slow 就指向要删除节点的前一个节点。
  4. 修改指针,将 slow.next 指向 slow.next.next,即删除倒数第 n 个节点。
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:dummy = ListNode(0)dummy.next = headfast = dummyslow = dummy# 让 fast 先向前移动 n+1 步for _ in range(n + 1):fast = fast.next# 同时移动 fast 和 slowwhile fast is not None:fast = fast.nextslow = slow.next# 删除倒数第 n 个节点slow.next = slow.next.nextreturn dummy.next

30、两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

img

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

思路解答:

1、递归的终止条件是当前节点或者下一个节点为空。

2、交换当前节点和下一个节点,然后递归地交换剩余的节点。

3、返回交换后的头节点。

def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:if not head or not head.next:return head# 交换当前节点和下一个节点next_node = head.nexthead.next = swapPairs(next_node.next)next_node.next = headreturn next_node

31、K个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

img

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

img

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

思路解答:

  1. 递归函数
    • 定义了一个递归函数 reverseLinkedList(head, k),用于翻转以 head 开头的链表的前 k 个节点。
    • 在函数内部,首先向前移动 k 步,找到需要翻转的节点范围。
    • 如果找到了 k 个节点,递归调用函数翻转剩余部分,并将当前部分翻转后的头节点返回。
  2. 翻转操作
    • 在翻转操作中,使用迭代的方式将当前 k 个节点进行翻转,然后将翻转后的部分连接起来。
  3. 递归调用
    • 在主函数中,直接调用递归函数 reverseLinkedList(head, k),开始处理整个链表。
  4. 返回结果
    • 最终返回处理完整个链表后的头节点。
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:def reverseLinkedList(head, k):count = 0curr = headwhile curr and count < k:curr = curr.nextcount += 1if count == k:reversed_head = reverseLinkedList(curr, k)while count > 0:next_node = head.nexthead.next = reversed_headreversed_head = headhead = next_nodecount -= 1head = reversed_headreturn headreturn reverseLinkedList(head, k)

32、随机链表的复制

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点

例如,如果原链表中有 XY 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 xy ,同样有 x.random --> y 。返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0n-1);如果不指向任何节点,则为 null

你的代码 接受原链表的头节点 head 作为传入参数。

示例 1:

img

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

img

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

img

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.randomnull 或指向链表中的节点。

思路解答:

  1. 第一次遍历:创建一个哈希表 node_map,并在遍历的过程中,将原节点和对应的新节点存储在哈希表中。
  2. 第二次遍历:根据原节点的指针关系,更新新节点的指针关系,包括 next 指针和 random 指针。
  3. 最后返回哈希表中存储的头节点对应的新节点,即深拷贝后的链表头。
def copyRandomList(self, head: Optional[Node]) -> Optional[Node]:if not head:return None# 创建哈希表用于存储原节点和新节点的对应关系result_map = {}# 第一次遍历,复制节点并存储到哈希表curr = headwhile curr:result_map[curr] = Node(curr.val)curr = curr.next# 第二次遍历,处理新节点的指针关系curr = headwhile curr:if curr.next:result_map[curr].next = result_map[curr.next]if curr.random:result_map[curr].random = result_map[curr.random]curr = curr.nextreturn result_map[head]

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

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

相关文章

金三银四,自动化测试面试题精选【美团二面】

面试一般分为技术面和hr面&#xff0c;形式的话很少有群面&#xff0c;少部分企业可能会有一个交叉面&#xff0c;不过总的来说&#xff0c;技术面基本就是考察你的专业技术水平的&#xff0c;hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求&#xff0c;一般来…

Decision Transformer

DT个人理解 emmm, 这里的Transformer 就和最近接触到的whisper一样,比起传统Transformer,自己还设计了针对特殊情况的tokens。比如whisper里对SOT,起始时间,语言种类等都指定了特殊tokens去做Decoder的输入和输出。 DT这里的作为输入的Tokens由RL里喜闻乐见的历史数据:…

安秉源代码加密,不仅可以正常加密,对编译调试无任何影响

源代码防泄密对于很多企业来讲都在使用&#xff0c;特别是在广东一些做智能制造的企业&#xff0c;这些企业在很早就意识到源代码防泄密的重要性&#xff0c;很多企业采用加密的方式对企业的源代码进行加密&#xff0c;也采用了相对应的加密软件&#xff0c;但是在使用一些加密…

nodejs配置环境变量后不生效(‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件)

一、在我们安装Node.js后&#xff0c;有时候会遇到node命令不管用的情况&#xff0c;关键是在安装时候已经添加配置了环境变量&#xff0c;向下面这样 但是还是不管用&#xff0c;这是因为环境变量配置不正确&#xff0c;权重不够&#xff0c;或者是命令冲突导致&#xff0c;解…

存内计算技术大幅提升机器学习算法的性能—挑战与解决方案探讨

一.存内计算技术大幅机器学习算法的性能 1.1背景 人工智能技术的迅速发展使人工智能芯片成为备受关注的关键组成部分。在人工智能的构建中&#xff0c;算力是三个支柱之一&#xff0c;包括数据、算法和算力。目前&#xff0c;人工智能芯片的发展主要集中在两个方向&#xff1…

nginx使用详解--缓存使用

Nginx 是一个功能强大的 Web 服务器和反向代理服务器&#xff0c;它可以用于实现静态内容的缓存&#xff0c;缓存可以分为客户端缓存和服务端缓存。 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个协商缓存的请…

【程序员的金三银四求职宝典】《春风拂面,代码在手:程序员的金三银四求职指南》

《春风拂面&#xff0c;代码在手&#xff1a;程序员的金三银四求职指南》 随着春风的轻拂&#xff0c;大地复苏&#xff0c;万物更新。在这个生机勃勃的季节&#xff0c;不仅自然界在迎接新生&#xff0c;对于广大的程序员朋友们而言&#xff0c;这也是一个全新的开始——金三…

数据库JSON类型到映射JAVA上

Mysql存放JSON数据如何映射JAVA实体类 概述&#xff1a;最近写在写SKU模块中&#xff0c;需要表中字段存放JSON类型数据&#xff0c;mybatis-plus在查询的时候如何跟JSON类型所匹配呢&#xff1f;再次记录一下。 直接上代码&#xff0c;后面有解释到底如何映射上的。 Mysql表…

推荐几款优秀免费开源的导航网站

&#x1f9a9;van-nav 项目地址&#xff1a;van-nav项目介绍&#xff1a;一个轻量导航站&#xff0c;汇总你的所有服务。项目亮点&#xff1a;全平台支持&#xff0c;单文件部署&#xff0c;有配套浏览器插件。效果预览 &#x1f9a9;发现导航 项目地址&#xff1a;nav项目…

Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用 Feign和OpenFeign Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端&#xff0c;可以使用⽤它来发起请求&#xff0c;进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求&#xff0c;而不是像RestTemplate那样&#xff0c;在Java中通过封装HTTP请求…

android开发技术论文,Android中为什么需要Handler

前言 马爸爸总结了一句话&#xff1a;跳槽&#xff0c;要么是钱不到位&#xff0c;要么是受了委屈。 我给自己这次的跳槽经历做了一个分析&#xff0c;希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作&#xff0c;但是对“换工作”的理解可能仅限于写简历、投简历、…

信号系统之滤波器比较

比较 1&#xff1a;模拟与数字滤波器 大多数数字信号源自模拟电子设备。**如果需要对信号进行滤波&#xff0c;是在数字化之前使用模拟滤波器&#xff0c;还是在数字化后使用数字滤波器更好&#xff1f;**将通过两个对比来回答问题。 目标是提供 1 kHz的低通滤波器。模拟端是…