代码随想录 Day 4 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 、【链表】总结

WhatsApp API接口的隐秘角落:从协议解析到自定义消息引擎 本文深入解析WhatsApp API接口的隐秘角落,从协议逆向工程到自定义消息引擎开发实战。通过分析WhatsApp的二进制XML协议和加密机制,构建超越官方API限制的自定义消息引擎,实现高效、灵活的即时通讯解决方案。文章还提供了企业级架构设计和风控规避策略,助力开发者突破官方限制,提升消息到达率和成本效益。 阅读详情

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

题目链接/文章讲解/视频讲解: 代码随想录

1. 看到这道题的第一想法

        定义一个虚拟头节点dummy_head,以及一个临时节点current用于遍历链表,以及临时节点pre表示current.next;然后进入循环(循环条件是pre.next不为空),定义临时指针temp用于存放下一组交换节点的第一个节点;接下来开始交换节点,也就是pre指向current,而current.next指向temp。最后返回虚拟头节点next,就是链表新的头节点。

        这样做最后系统显示超时。

2. 看完代码随想录的想法

(1)定义dummy_head:但是要思考清楚dummy_head的作用是为了统一操作规则,防止直接操作头节点,改变头节点的值,最后无法返回交换后的头节点;

        定义current指针:用于遍历链表节点,由于要交换两个节点,所以需要找到交换节点的上一个节点才可以进行交换操作,所以此处需要初始化current指针指向虚拟头节点dummy_head。

(2)进入遍历交换操作:

        首先思考清楚边界条件作为循环的条件入口:当节点数为偶数时,循环的终止条件是current.next指向NULL,当节点数为奇数时,循环的终止条件是current.next.next指向NULL;因此只有当current.next不指向NULL并且current.next.next不指向NULL,才进行交换节点的操作。

        注意:进入循环的两个条件的顺序不可以交换,否则在判定过程中将产生空指针异常。也就是说两个判断条件不可交换。

 while current.next and current.next.next:

        接下来开始交换节点:首先为了防止交换节点后操作不了下一个节点,先将需要交换的第一个节点使用临时指针temp进行保存;然后将current.next指向current.next.next,然后新的current.next的next应该指向的是temp,即current.next.next=temp,而temp的next应该指向未改变节点前的current.next.next.next,而进行操作后current.next.next.next已经发生了变化,因此current.next.next.next也应该在交换节点前用临时指针temp1进行保存,那么此时temp.next = temp1,完成了循环一次的交换操作。接下来,应该移动current指针让它进入下一次循环,也就是current=current.next.next,直接让它向后移动两个节点即可,不需要管他后面两个节点是什么。

(3)最后返回dummy_head.next即为交换完成后的新链表头节点。

3. 实现过程中遇到的困难及解决

(1)如果不思考清楚边界条件,容易陷入空指针异常或无限死循环。

空指针异常:如果这个指针为空,而对它进行操作,就会出现空指针异常,所以在进行操作时,必须思考清楚是否会有对空指针进行操作,从而提前对它进行限制。

(2)要在进行操作前来缓存交换操作会影响的节点,否则在交换后将无法找到需要进行操作的节点,会改变节点,造成逻辑错误。

(3)要考虑清楚current指针初始化到底应该指向dummy_head还是dummy_head.next,这取决于循环遍历规则的一致性,在本题中由于需要交换两个节点,那么必须找到该节点的上一个节点,所以此处current初始化指向为dummy_head。

(4)在进入下一次循环前,需要移动current指针,让它直接向后移动两个节点即可。

二、19.删除链表的倒数第N个节点

题目链接/文章讲解/视频讲解: 代码随想录

1. 看到这道题的第一想法(以下是AC的代码)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:
    def get_length(self,head: ListNode) -> int:
        length = 0
        current = head
        while current:
            length += 1
            current = current.next
        return length

    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy_head = ListNode(next=head)
        if n < 1 or n > self.get_length(head):
            return -1
        else:
            current = dummy_head
            for i in range(self.get_length(head) - n ):
                current=current.next
            current.next = current.next.next
        return dummy_head.next

(1)定义一个虚拟头节点dummy_head;然后定义一个current由于循环遍历链表,初始化指向dummy_head。

(2)根据归纳法发现,要删除倒数第n个节点,则要删除的节点下标为链表长度-n,因此为了删除倒数第n个节点,需要将current指向倒数第n个节点的前一个节点就停止遍历,即当current指向下标为size-n-1的节点,就跳出循环。

(3)接下来就进行删除节点的操作,也就是current.next = current.next.next。

(4)最后返回dummy_head.next即可。

(5)这种方法可以AC,但需要注意链表不可以直接self.size来获取长度,而应该定义一个函数来计算链表长度。

def get_length(self, head:ListNode):
    current = head
    length = 0
    while current:
        length+=1
        current=current.next
    return length

2. 看完代码随想录的想法

        巧妙的快慢指针思路,值得学习:

(1)先定义虚拟头节点,因为如果要删除的是头节点head,那么需要单独讨论,所以为了避免这种情况,采用虚拟头节点的方式统一处理。

(2)定义快慢指针,初始化都指向虚拟头节点。

(3)快指针先移动n步,然后快慢指针再一起移动,直到快指针指向NULL就停止移动,此时慢指针刚好指向的是需要删除的倒数第N个节点的前一个节点,然后退出循环遍历。

(4)慢指针的next直接指向next的next,就完成了删除倒数第N个节点的操作。

(5)最后返回虚拟头节点的next。

三、面试题 02.07. 链表相交

题目链接/文章讲解: 代码随想录

1. 看到这道题的第一想法

(1)暴力解法:先遍历一遍A链表,然后嵌套遍历B链表,找到链表节点完全相同的一段子链表,最后返回即可。

(2)反向从后往前遍历链表,但不知如何实现。

(3)看了提示后成功AC:

        A.首先,为了获取A和B链表的长度,所以定义取链表长度的函数 ;

        B.然后,在主函数中取得A、B链表的长度,并计算AB长度的差值diff;接下来分别定义currentA和currentB来对A、B链表进行遍历循环;

        C.分类讨论A和B链表长度是否相同、大于、小于:

        当diff=0时,表明A和B链表长度相同,那么以currentA和currentB不为null作为进入循环的条件,首先判断currentA和currentB两个指针是否指向的是同一节点,如果是的话返回任一节点即可,如果不是则两个指针一起向下循环。

        当diff>0的时候,表明A比B长,那么采用for循环,让currentA先走diff步,然后再和diff=0时的做法即可(同上);

        当diff<0的时候,表明B比A长,那么采用for循环,让currentB先走diff步,然后再和diff=0时的做法即可(同上);(特别注意:此时diff<0且diff是int类型,所以不可以写成:for i in range(diff),会报错,而应该在diff外面嵌套abs函数,将负数取成整数!!)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def get_length(self,head:ListNode):
        length = 0
        current = head 
        while current:
            length += 1
            current=current.next
        return length

    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        currentA = headA
        currentB = headB
        diff = self.get_length(headA) - self.get_length(headB)
        if diff == 0:
            while currentA and currentB:
                if currentA == currentB:
                    return currentA
                else:
                    currentA=currentA.next
                    currentB=currentB.next
            
        elif diff > 0:
            for i in range(diff):
                currentA=currentA.next
            while currentA and currentB:
                if currentA == currentB:
                    return currentA
                else:
                    currentA=currentA.next
                    currentB=currentB.next
        else:
            for i in range(-diff):
                currentB=currentB.next
            while currentA and currentB:
                if currentA == currentB:
                    return currentB
                else:
                    currentA=currentA.next
                    currentB=currentB.next

2. 看完代码随想录的想法

同上

3. 实现过程中遇到的困难及解决

(1)当diff<0时,diff是int类型,所以不可以写成:for i in range(diff),会报错,而应该在diff外面嵌套abs函数,将负数取成整数!!

(2)解决这道题目如果没有思路的话,可以先考虑最简单的情况,也就是A、B链表长度一样的时候如何写,然后再去考虑长度不一样应该如何处理,由特殊情况推广至一般情况。

四、142.环形链表II

题目链接/文章讲解/视频讲解: 代码随想录

1. 看到这道题的第一想法

        首先定义一个虚拟头节点,然后定义快慢指针指向虚拟头节点,然后快指针先移动几个节点,慢指针再开始移动,直到两个指针相遇就是开始进入循环的第一个节点。

        问题在于不知道快指针到底先移动多少步。

2. 看完代码随想录的想法

(1)要先思考清楚如何能够获取到进入环的第一个节点:

        首先,定义快慢指针,快指针每次移动2步,而慢指针每次移动一步(因为二者的相对速度为1,所以在进入环内进行循环时,快指针追上慢指针不会跳过慢指针,并且快指针一定是在慢指针进入环内第一圈就可以追上);

        然后,明确这道题目的关键在于获取慢指针离进入环的第一个节点的距离是多少,可以设参数解方程得到,具体推导如下:

需要注意的是快指针和慢指针相遇不一定是在进入环的第一个节点!

        由上图可以推导出,在快慢指针相遇后,一个指针从相遇点出发,而另一个指针从头节点出发,以相同的速度移动,最终相遇的第一个节点就是进入环的第一个节点。

(2)开始写代码:

        首先定义快慢指针均从头节点出发,然后因为快指针速度为2,比慢指针先将链表遍历,所以快指针的next以及next.next不为空时,进入循环;

        然后由于快慢指针从同一起点出发,所以需要先让快慢指针以各自的速度移动后,再进行判别,判别快慢指针是否相遇;

        如果快慢指针相遇,那么得到相遇点,此时我们将其中一个指针移动回头节点,另一个指针从相遇点出发,以相同的速度移动,直到相遇就是我们需要求得的环的第一个节点;

        如果没有环,则输出None。

五、【链表】总结

一般涉及到 增删改操作,用虚拟头结点都会方便很多, 如果只能查的话,用不用虚拟头结点都差不多。

当然也可以为了方便记忆,统一都用虚拟头结点。

代码随想录

 

SolidWorks速成教程P3-6【零件 | 第六节】——草图封闭轮廓&所选轮廓&厚度为零的报错 到这里,我们已经将特征成型的常用功能学完。这节我来继续讲解一下 SolidWorks中建模的一些容易忽略的问题(草图封闭轮廓&所选轮廓&厚度为零的报错)。 阅读详情

相关推荐

相机通用类之海康相机,软触发硬触发(飞拍),并输出halcon格式对象

如何显示图像:可以访问我文章开头的博客,通过编写相机通用类即可,程序中是有继承通用类,通过访问相机通用的获取图像数据,从而传输图像数据。具体可以查看相机通用类。整体过程其实比较简单,由于海康相机没有像一些品牌相机一样可以直接使用序列号开启相机,所以我们需要通过对相机信息进行索引,根据索引到的相机序列号来开启相机。

m0_51559565的博客 7620

代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

qq_42952637的博客 1106

ArcGIS利用模型构建器批量导出nc文件中的不同波段数据

ArcGIS利用模型构建器批量导出nc文件中的不同波段数据

Yuanbaokk的博客 7253

代码随想录|算法训练营Day4|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II

链表的四道核心算法题,三道中等,一道简单。

weixin_43978140的博客 1586

osgearth2.10 demo功能介绍

osgearth-2.10 demo: 说明: 1、运行环境win7 x64 旗舰版,CPU i5-6400 8核,8G内存; 2、括号内是对应demo的测试参数(.earth); 3、配置OSG_FILE_PATH; 4、参数命令行可以查看各个demo需要的输入参数; 5、前缀说明:gui界面程序、cmd控制台程序、non功能未知; 6、程序后括号里的non表示不需要通过命令行输入参数; 示例: 1、gui:osgearth_3pv(simple.earth):相机与地球的投影关系,Range表示相机

rach09的专栏 2422

innovus:Clock Gating Check设置与报告

看图后发现,在设置clock gating check之前报告也会有clock gating check的值,这个就是因为timing library中会像reg一样定 library setup time值,如下图。我们常用set_clock_gating_check -setup去过约束Place阶段reg2cgate的时序,以防CTS后由于tree不平导致的时序违例。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1012

Studying-代码随想录训练营day4| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

力扣:24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

yachihaoteng的博客 1311

Open3D 体素下采样【2026最新版】

体素滤波,博客长期更新,本文最近更新时间为:2026年4月11日。

点云侠的博客 37万+

代码随想录【day 4 链表】| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

代码随想录【day 4 链表】| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

weixin_43891814的博客 2709

【AI编程】Trae 环境搭建与配置从使用到项目实战详解

Trae 环境搭建与配置从使用到项目实战详解

congge 5651

Simulink实例--电动汽车充电站与微电网协同运行仿真

​电网负荷剧增:单站1000台车同时充电需150MW功率(超配电网容量30%)​能源孤岛问题:传统充电站仅作为单向负荷,无法参与电网调频​可再生能源消纳:光伏/风电波动导致充电站功率波动±40%​多目标矛盾:充电效率、电网稳定性、设备寿命的协同优化​节能效果:每百万辆车年节电1.8GWh​成本回收:投资回报周期<4年(IRR>25%)​减排效益:每年减少CO₂排放12万吨。

xiaoheshang_123的博客 330

【代码随想录】Day4 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

链表的第二部分今天主要加深了链表的理解以及环形链表,虽然以前做过,但是不熟练,今天收获很多。DAY Finished 撒花~

SuperMao2016的博客 894

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1056

代码随想录DAY4 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

语言为python 题目中所有的参考资料都来自于代码随想录大家可以自行查看24. 两两交换链表中的节点题目解析:题目要求需要交换相邻链表节点 只能进行节点交换 然后返回头节点 不得修改节点内部的值。

qq_39508891的博客 1491

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

代码随想录算法训练营Day4 | 24两两交换链表中的节点、19删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

链表:两两交换、删除指定节点、链表相交、环状链表

宁愿过拟合不要欠拟合 1113

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

代码随想录 Day4 | Leetcode24 两两交换链表中的节点、Leetcode19 删除链表的倒数第N个节点、面试题 02.07 链表相交、Leetcode142 环形链表II

同是碳基生物,怎么差别这么大。。。。

qq_41502639的博客 1245

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

代码随想录算法训练营Day4(LeetCode24 两两交换链表中的节点;LeetCode19 删除链表的倒数第N个节点;面试题02.07 链表相交;LeetCode142 环形链表II)

反而使得我对指针为空的判断变得更加复杂了,看了代码随想录发现只需要一个。这道题需要使用双节点,遍历一遍就可以了。我在做的时候,第一次返回了。这道题不难但是还是看了题解思路才写出来的,而且有一些冗余变量。这道题直接写出来了,但是一开始用了很多指针,用于表达。这道题看了题解,关键在于要理解第一次相遇时,,但是这个节点可能被删除了,因此需要返回。的交换来减少,这里的细节还需要注意。变量,这样反而将为空判断全部放到。

weixin_51001256的博客 1284

【代码随想录训练营第42期 Day4打卡 LeetCode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题02.07. 链表相交 142.环形链表II】

递归,双指针,哈希在链表中的应用

记得要努力变强 1576

代码随想录Day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

Day4

sRiddle的博客 1006

代码随想录刷题day4丨24. 两两交换链表中的节点,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II ,链表总结

链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题。反转链表是面试中高频题目考察链表的操作其实就是考察指针的操作,是面试中的常见类型。

m0_75195038的博客 871

代码随想录算法训练营DAY4 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。,n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。当 n为1的时候,公式就化解为。

muye214的博客 1397

代码随想录Day4 | 24. 两两交换链表中的节点,19. 删除链表的倒数第N个节点,面试题 02.07. 链表相交,142. 环形链表II

【链表】24. 两两交换链表中的节点,19. 删除链表的倒数第N个节点,面试题 02.07. 链表相交,142. 环形链表II

weixin_43913958的博客 822

[代码随想录Day4打卡] 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

代码随想录打卡第4天,希望坚持。这一篇关于链表最后一部分。

goodenough5的博客 1002

代码随想录Day4| LeetCode 24 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

一定是快指针先进入这个环,然后慢指针才进入这个环,快在追慢的过程,快指针是以什么速度接近慢指针呢。相对于慢指针快指针的速度是每次移一个节点的移动速度。所以他两一定会相遇。此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。为了方便举例,假设节点元素数值相等,则节点指针相等。从起始位置到入口处x,相遇到入口y,y到出口是z。

luyimin87的博客 1006

代码随想录Day4 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

用快慢指针,快指针每次移动两个结点,慢指针每次移动一个结点,如果快慢指针相遇,则证明有环。: 是指同一个结点,即同一个地址存储的同一个结点,并不是指结点的数值相等。因为快指针的速度是慢指针速度的2倍,假设慢指针在第一圈的时候没被追上,则慢指针走到第一圈终点时,快指针已经走了两圈,所以一定可以追上。两个链表的长度不一定相等,但相交部分一定是后部分,即如果从某个结点开始相交,则后面的部分一定都相交。指向2结点,1结点无法访问到;也就是说,如果两个链表的当前结点,后面的节点数量都不一样,那当前结点一定不是交点。

m0_73617263的博客 1139

Day4补代码随想录 24.两两交换链表中的节点|19.删除链表的倒数第N个节点|面试题 02.07. 链表相交|142.环形链表II

用虚拟头节点,因为头节点也可能被要求删除。如果删除头节点,需要虚拟头节点。要删除的是“倒数第n个节点”,因此需要fastIndex作为基准。快慢指针保持一个相对距离。如果没有交点的时候,当p1为null,p2也为null代码才返回null吗,只有一个为null还是继续执行。因为交点之后的部分是相同的,两指针进入公共部分后会同步。这题的思路很巧妙。

爱因斯小柚的博客 739
上一篇: 代码随想录Day 3 | 【链表理论基础】203.移除链表元素、707.设计链表、206.反转链表
下一篇: 代码随想录 Day 6 | 【哈希表理论基础】、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值