24. 两两交换链表中的节点
这道题给我的第一感觉就是好像没什么难度,就是每两个节点反转一下,最后连起来就行,但是实际上手~~~~(懂的都懂,不多说哈)
思路:建议使用虚拟头结点(如果小伙伴对虚拟头结点不清楚的话可以看我上一篇博客,或者看一下卡哥的听说用虚拟头结点会方便很多? ) 接下来我们就开始两两交换就可以,我会在下面给出思考图和代码
流程图(这里借用了一下卡哥的图)
代码如下:
19.删除链表的倒数第N个节点
这道题是双指针很经典的一道题,会运用双指针和虚拟头结点(有对双指针或虚拟头结点不了解的可以翻看我之前的博客,或者去看一下卡哥的链表 .听说用虚拟头结点会方便很多 和双指针经典题目 LeetCode977. 有序数组的平方
这道题的思路:我们需要先设置一个虚拟头结点,然后我们需要设置两个指针在虚拟头结点上,一个start指针和一个end指针,我们先让start指针先走n+1(先走n+1的目的是在后面start和end指针同时走的时候,可以让end指针指向倒数第n个节点的前一个节点),然后我们让start指针和end指针同时走,最后当start指针指向空节点的时候,end的节点也指向了倒是第n个节点的前一个节点,这时候我们只需要让end的当前节点的next节点指向next的next的节点就可以了
代码如下:
面试题 02.07. 链表相交
简单来说就是求两个链表交点的节点的指针,需要注意的是(不是两个链表的值相等,而是指针相等)
思路: 我们可以让两个链表一起走,那么当有一个链表先走完,这时候,我们让这个链表在赋值成对方的原链表,这样两个链表总会相交到一起
142.环形链表II
这道题其实是两个问题,第一链表有没有环? 第二 如果有环,那入环口在哪? 下面我们一个一个来说
第一有没有环? 我们可以通过快慢指针+循环来判断,快指针一次两步,慢指针一次一步,如果快指针为空了,则证明这个链表没有环,但是如果循环过程中快指针等于慢指针,那么就证明此链表有环
第二 当有环后,我们需要去获得入环口在哪里,当我们的快指针等于慢指针后,我们需要将快指针复制到头结点上,然后快指针和慢指针每次都走一步,最后相遇时就是入环口(具体为什么可以看看卡哥的这篇文章环形链表II
代码如下: