那些你不知道的双指针oj

快慢指针

24. 两两交换链表中的节点 - 力扣(LeetCode)
看题解前:感觉还是比较简单,关键在于保留3个节点,当前节点,当前节点的前一个节点以及当前节点的下一个节点,基本思路就在于当前节点的指针指向前一个节点实现翻转(交换节点),然后cur直接跳到原当前节点的下一个节点进行下一次此操作。但是我忽略了一点,就是cur如果直接跳走了的话,
直接进行下一次翻转,1链接的还是3,且因为没有保留1的位置导致1的next无法修改,所以我在每次翻转结束后,就将1的next指向了next的next,如果next->next为空,说明剩下的为奇数个节点也没必要翻转直接退出即可,不为空则改变链接,最终解题成功。

看题解后:题解的做法思路大致跟上述一样,都是记录节点,然后开始操作,然后进入下一轮交换,然后的话就是借助了虚拟头节点,在代码实现上更加方便一些。

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

看题解前:思路也比较简单,快慢指针,fast提前走n+1步,然后slow和fast同时走到fast为空停止,此时slow的下一个节点就是待删除节点,保存slow->next,然后slow指向下一个节点的下一个节点,最后删除slow->next(之前保存的,防止内存泄漏)。
看题解后:大思路没有问题,还是借助了虚拟头节点,之前我一直不理解为什么非要用一个虚拟头节点,这个题算是明白的,加上虚拟头节点可以契合我们一般以0为第一个元素的下标的习惯进行遍历,不然很容易就不知道自己走到了n还是n-1的问题。

面试题 02.07. 链表相交 - 力扣(LeetCode)

看题解前:有了上一题快慢指针的思路,这题一遍过,首先计算两个链表节点个数,长的链表先走差距个数,然后两个链表同时走,时刻比较每个节点的指针,相等即为相交点,退出如果一个为空说明走到终点都没相交返回nullptr,否则返回相交节点的指针。

看题解后:因为两个链表不知道具体哪个长,题解默认A为长链表,如果B更长则让A和B交换,使得后面可以统一操作。

142. 环形链表 II - 力扣(LeetCode)
看题解前:快慢指针依旧可以解决问题,fast每次走两步,slow每次走一步,如果有环的话fast比slow先进环,然后再环内转圈,迟早和slow相遇,如果没环fast直接走到空。到这里只找到了环,但是我还没有想到怎么找到环的入口。

看题解后:上述思路找到有环是正确的,关于如何确定环的思路,这里推荐观看代码随想录环形链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值