代码随想录再战day4

news2024/12/24 11:27:10

24 两两交换链表的节点

力扣

 

 思路:

        还是看了carl哥的视频讲解才写出来。有点难搞

        首先 还是老样子 需要一个dummyhead虚拟头节点。

        然后核心就是 我们要操作后面两个节点的时候 一定要移动到 这两个节点的上一个节点。

(来自代码随想录)

 然后返回我们的虚拟节点.next即可

def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        
        dummy_head = ListNode(0)
        dummy_head.next = head 
        cur = dummy_head 
        while cur.next!=None and cur.next.next!=None:

            temp = cur.next 
            temp1 = cur.next.next.next
            cur.next = cur.next.next 
            cur.next.next = temp  
            temp.next = temp1 
            cur = cur.next.next 
        return dummy_head.next

19 删除倒数第n个节点 

力扣

 思路:

        这道题 理解一下 倒数第n个。我认为按照我这么理解更好,倒数第n个就说明当前后半部分有多少个元素。举个例子[1,2,3,4,5].比如说n=2,那就是倒数第二个,是不是最后只有2和5这两个元素了。那么我们可不可以先计算出 一共有多少个元素。然后用一个count记录总个数,再减去这个n。是不是就刚好是前面有多少元素。然后设置一个指针在range(count-n)中走这么多步

然后会惊奇的发现 走了这么多步数以后当前的cur指针 刚好是倒数第n个节点的上一个节点。

这个时候只需要让cur的next指针指向下下个元素 就完成了删除节点的操作了!

代码:

def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        count = 0 
        dummy_head = ListNode(None,next = head)
        cur = dummy_head

        #设置快指针
        fast = dummy_head
        while cur.next!=None:
            cur = cur.next
            count+=1
        steps = count 
        for _ in range(steps-n):
            fast = fast.next 
        fast.next = fast.next.next
        return dummy_head.next
        

16-相交链表

力扣

 

思路:

        这道题依靠自己写了绝大部分 但是最核心的交换两个链表 的步骤还是看了以前写的笔记。。

        核心就是:值相同 不代表指针相同

                首先 是计算ab链表的长度,并且计算他们的差值。

                然后 让长度短的链表 移动到 和长的链表末尾对齐的位置 

                再去进行比较 

                最后判断 return headA if headA==headB else none 

代码:

def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        cur = headA 
        len_a = 0 
        len_b = 0 
        cur_b = headB
        while cur.next:
            cur = cur.next
            len_a+=1 
        step_a = len_a
        while cur_b.next:
            cur_b = cur_b.next
            len_b+=1 
        step_b = len_b
        cur = headA
        cur_b = headB
        if step_b > step_a:
            step_a,step_b = step_b,step_a
            cur,cur_b = headB,headA
        gap = abs(step_a-step_b)
        while gap!=0:
            cur = cur.next
            gap-=1 
        while cur!=None:
            if cur==cur_b:
                return cur 
            cur = cur.next
            cur_b = cur_b.next
        return None

 环形链表

142力扣 

 这道题,我没有想到  找到了环之后 还要再一次找入口 这是我的读题问题 没有理解到 

我以为只要是找到了环可以直接返回 

思路:

        这道题 可能会用到一个数学推理 

                这里用一下卡哥的笔记 (来自代码随想录)

        如何判断有没有环:一开始分别设置快慢指针 快指针走两步 慢的走一步。如果他们两个相遇 肯定是在环内相遇 因为快指针肯定比慢的要先进入环中。所以他们的第一次相遇肯定是在环内。

        判断了有环之后:慢指针走过的节点数是x+y

                                     快指针走过的节点数是x+y+n(y+z) n代表快指针在里面走了几圈。因为快指针最少也要一圈才能重新追上慢指针。并且 快指针一次走两步 

所以 在快指针走的节点数的基础上还要*2 

所以当2*(x+y) = x+y+n(y+z)

解开之后x +y = n(y+z).既然是找环的入口 ,那肯定是出现在x上面,要求的就是x 

        x = ny+nz-y 

       提一个y出来,x = y(n-1)+nz 

        我们明确了n是>=0的。所以当n = 1的时候,x = z。所以从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。(来自随想录)

        代码:

                

def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:

        

        #设置快慢指针

        fast = head
        slow = head
        
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next

            if slow==fast:
                slow = head 
                while slow!=fast:
                    slow = slow.next
                    fast = fast.next
                return slow 
        return None

                                       

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

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

相关文章

EasyFlash在GD32F303CC上面的移植

记录学习的过程,如果在GD32F303CC上面移植EasyFlash。关于EasyFlash的相关介绍和源码,请参考:https://gitee.com/Armink/EasyFlash 或者 https://github.com/armink/EasyFlash 主要记录移植过程中需要注意的点,移植还是比较简单的…

6.6 极重要的复习,权限与指令间的关系

权限对于使用者账号很重要,因为他可以限制使用者能不能读取/创建/删除/修改文件或目录。 一、让使用者能进入某目录成为“可工作目录”的基本权限为何: 可使用的指令:例如 cd 等变换工作目录的指令; 目录所需权限:使…

liunx安装git

liunx安装git : 提示:记录自己装git 过程 执行下边命令安装 yum -y install git 安装完查看是否安装成功 git --version安装路径默认在/usr/libexe 愉快开始使用git

帆软 FineReport 绘制漏斗图

七一建党节,祝党生日快乐! 夏日炎炎,周末在家,想起在用帆软做页面展示的时候,使用到了漏斗图,记录下来,方便查看。 以订单销量变化为例,分为五个阶段,商品浏览人数&#…

fastadmin给操作按钮添加权限菜单控制|新增权限控制菜单

1、在对应的控制器文件中,添加如下代码: $adminIds $this->getDataLimitAdminIds(); if (is_array($adminIds)) {if (!in_array($row[$this->dataLimitField], $adminIds)) {$this->error(__(You have no permission));} } 2、在对应的index…

Redis实战篇(三)

四.分布式锁 4.1.分布式锁概述 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程并行,让程序串行…

通过简数实现全网文章采集的方法简介

简数是一款全网文章采集工具,旨在帮助站长通过设置关键词来进行全网文章采集。然而,使用简数可能会有一些相对复杂的操作,导致站长在学习和使用过程中面临较高的学习成本,因为其中涉及到许多专业术语和功能的作用不明确。鉴于这一…

Unity - 搬砖日志 - UGUI合批优化 - Overlap(UI AABB 有重叠), Z != 0 照样合批的方案

文章目录 环境目的Screen Space - Overlay优化限制该方案起源 环境 Unity : 2020.3.37f1 Pipeline : BRP (另一个项目在 2021.1.xx 的 LTS 下的 URP 管线同样如此,目测:因为 UGUI 不受渲染管线切换而变化) 目的 便于索引&#…

IDEA启动Tomcat控制台乱码问题解决方法

最近项目需要用到Tomcat跑一个项目,但是开发Sprintboot项目久了,也很少用Tomcat,因为Springboot是集成Tomcat等中间件的,所以不需要下载Tomcat,好了,回归真题,本博客介绍跑Tomcat过程遇到的控制…

信道编码【编码、纠错检错】

差错控制的基本概念--数字信号在传输过程中,由于信道传输特性不理想及加性噪声的影响,不可避免地会发生错误。 可通过以下三方面的措施来减小误码率:1)提高信道容量;2)降低编码效率;3&#xff…

Binder系列--ServiceManager的启动

ServiceManager的启动 hongxi.zhu Android 13 主要流程: 1. 启动ServiceManager进程 ServiceManager是由init(pid 1)进程启动的 system/core/rootdir/init.rc on init......# Start essential services.start servicemanager //framework层使用start hwservic…

Linux | Ubuntu卸载QQ

Linux | Ubuntu卸载QQ 终端输入: dpkg -l| grep qq如下图,找到QQ文件: 删除命令: sudo apt-get --purge remove 文件名在终端输入: sudo apt-get --purge remove libqqwing2v5:amd64如下图删除成功

【Java程序设计实训】基于B/S架构的MyShop商城

MYSHOP商城 实验目的实验概述系统功能概述Myshop 商城概述系统开发分析功能列表系统用例图系统活动图 数据库设计运作界面展示用户管理模块新用户注册用户登录商城首页与用户退出 商品模块商品分页展示查看商品详情信息 购物车模块空购物车页面加入商品到购物车 订单模块提交订…

4.32UDP通信实现 4.33广播 4.34组播 4.35本地套接字通信

4.32UDP通信实现 ![在这 udp_client.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd socket(PF_INET, SOCK_DGRAM, 0);if(fd -1) {…

springboot项目外卖管理 day08-缓存优化

文章目录 一、缓存优化问题说明环境搭建导入maven坐标配置yml文件设置序列化器&#xff0c;编写配置类 缓存短信验证码缓存菜品数据实现思路 SpringCacheSpring Cache介绍Spring Cache常用注解Spring Cache使用方式 缓存套餐数据实现思路 一、缓存优化 问题说明 环境搭建 导入…

【Framework】startService启动流程

前言 启动service有两种方式&#xff1a;startService和bindService。 这一篇先讲startService&#xff0c;读者如果只想看流程图&#xff0c;可以直接跳到总结。 1. ContextImpl 代码路径&#xff1a;frameworks\base\core\java\android\app\ContextImpl.java 1.1 startServ…

SHA-256算法及示例

1. 引言 SHA-256&#xff08;安全哈希算法&#xff0c;FIPS 182-2&#xff09;是密码学哈希函数&#xff0c;其摘要长度为256位。SHA-256为keyless哈希函数&#xff0c;即为MDC&#xff08;Manipulation Detection Code&#xff09;。【MAC消息认证码有key&#xff0c;不是key…

【数据库】外键的作用

前言 说到外键&#xff0c;一般就会牵扯出约束。不谈约束&#xff0c;起始外键就是一个普通的字段&#xff08;Column&#xff09;&#xff0c;起到一个关联的作用。 先把约束放一边&#xff0c;看看外键有哪些作用。 建立表中记录的一对一的关系 学生表&#xff1a; 手机表…

C++引用计数

文章目录 1. 什么是引用计数2. 引用计数的实现3. 示例代码 1. 什么是引用计数 引用计数&#xff08;reference count&#xff09;的核心思想是使用一个计数器来标识当前指针指向的对象被多少类的对象所使用&#xff08;即记录指针指向对象被引用的次数&#xff09;。它允许有多…

Linux--查找文件指令:find

语法&#xff1a; find pathname -name 文件名 示例&#xff1a; 从根目录下开始查找名字中带file.txt文件的路径