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

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

题目链接/文章讲解/视频讲解: 两两交换链表中的节点

思路: 链表相关的题目一般都会先定义一个虚拟头结点,方便一系列的操作,交换链表中相邻两个结点,其实就是交换双方的指向,动手画一个图很容易理解,最容易想到的方法就是迭代,按照某一规则,不断更改链表的指向。

        先拿前两个结点举例,由于要更改node1,node2的指向,所以先定义三个新结点(temp1,temp2,temp3)对node1,node2,node3(因为node2指向node3,为了方便也将该节点记录)进行记录。

        第一步,虚拟头结点cur->next=temp2;

        第二步,temp2->next=temp1;

        第三步,temp1->next=temp3; 

        此时,链表为:cur->node2(temp2)->node1(temp1)->node3->(temp3)->node4->node5->node6->.....->null    然后将cur后移两步,继续更换下两个相邻结点的位置。


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

题目链接/文章讲解/视频讲解:删除链表的倒数第n个节点

思路: 1.最容易想到的方法就是先循环求出链表的长度length,然后遍历到倒数第n-1个结点,然后删除倒数第n个节点。

2.第二个方法就是双指针:快指针fast,慢指针slow(初始同为虚拟头节点), 假设链表总长为N,先让fast移动n+1个位置,此时fast比slow先走n+1个节点,然后fast和slow再同时向后移动(每次移动一个位置),当fast走到null时,此时slow的位置就在倒数第n-1个节点的位置。

     在fast和slow同时移动期间,fast走了(N-n)个节点,那么slow也走了(N-n)个节点,与数组类似,所以slow此时就指向倒数第n-1个节点的位置。画图之后就很容易理解了。


面试题 02.07. 链表相交

题目链接/文章讲解:链表相交

思路:该题说的相交的节点并不是该节点的val值相同,而是在内存中存储的位置是相同的。

       该题最容易想出来的方法还是双指针(curA,curB),初始位置分别为headA,headB,然后求出两个链表的长度,因为不知道哪个链表长,所以干脆就让headA是长的,headB是短的。然后让curA,curB从同一位置出发,由于headA长,计算两者长度的差值len,先让curA移动len长度个位置,此时两个指针就在同一个位置了,之后开始遍历headA或者headB(因为curA和curB的起始已经相同了,两个链表剩下的节点个数也是相同的),在遍历过程中如果 if(curA==curB)成立,则说明有相交的节点,也就是目前所指向的位置,然后返回该节点。否则不存在相交节点。

   个人觉得最简单最容易理解的方法就是哈希表,感兴趣的小伙伴可以了解一下。


142.环形链表II

题目链接/文章讲解/视频讲解:环形链表II

思路:直接上双指针(快fast,慢slow),存在环的话该题就类似于追击问题了,fast一次走两个位置,slow一次走一个位置,存在环的话肯定是fast先进环,之后slow进环,由于fast移动速度是slow的两倍,二者肯定会在环中相遇,如下动画演示:

       剩下的步骤看代码随想录的文档即可,简单清晰,不过有一处让人不太容易想明白的地方,那就是为什么slow最多转一圈两者就会相遇,下面举例说明:

       就像在操场上跑步,A和B赛跑(前提是A跑的比B快至少两倍的速度,姑且是两倍),那么从同一起点出发,当B跑完一圈的时候,A是不是已经跑完了两圈,那么在A跑第2圈的时候,B还在跑第1圈,是不是A和B肯定会在B跑第一圈的时候相遇。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值