力扣刷题笔记5:双指针题目
题目1.移动0

解题思路: (1)这里使用双指针方法,定义left=right=0,然后判断nums[right]是否为0,如果是则right++;如果不是则left++,right++,nums[left]
(2)一直执行(1)操作,直到right=nums.size()跳出循环
(3最后将left到right之间的元素都置为0(因为right-left就是0元素的个数)
具体代码如下:

题目2:删除数组元素中的重复项
解题思路:(1)这道题的标签是双指针,但是我觉得没有必要,直接用了vector中自带的erase函数,首先定义auto a=nums.begin();
(2)判断*a是否等于*(a+1),如果是a=erase(a).否则,a++,直到a=nums,end()
具体代码如下:
注意:使用erase函数后,返回值是指向删除元素(或范围)的下一个元素的迭代器。
题目3:删除链表的倒数第n个节点

解题思路:(1)这也是一道典型的双指针题目,首先定义left=right=head;
(2)让right行进n步
(3)让left和right同时前进,直到right==null;,这时left所指向的下一个节点就是要被删除的结点
(4)令left->next=left->next->next,返回head
具体代码如下:

题目4:反转链表
解题思路如下:(1)定义一个指针p,指向尾结点;
(2)从首结点开始,依次取出该结点并嵌入p结点之后
(3)一直执行(2),直到该节点指向p;
具体代码如下:

题目5.环形链表||
解题思路:1.定义一个快指针fast和慢指针slow,快指针每次走两步,慢指针每次走一步;
2.情况一,快指针指向了null,证明无环,返回null;
3.情况二,快慢指针相遇,证明有环,头结点和入环结点长度为l,环的长度为s,快结点走过的长度为g,慢结点走过的长度为f;
(1)因为g=2f,g=f+ns,所以f=ns;
(2) 因为从头结点开始走l+ns(n=0,1,2,3...)肯定能走到入环结点,又因为此时f=ns,所以定义一个指针指向头结点,是该指针和慢指针按相同速度前进,相遇的点即为入环节点
代码如下:

题目6.三数之和

解题思路:
1.特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 。
2.对数组进行排序。
3.遍历排序后数组:
(1)若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。
(2)对于重复元素:跳过,避免出现重复解
(3)令左指针 L=i+1,右指针 R=n-1,当 L<R 时,执行循环:
(4)当 nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R移到下一位置,寻找新的解
(5)若和大于 0,说明 nums[R] 太大,R 左移
(6)若和小于 0,说明 nums[L]太小,L 右移
代码如下:

题目7.四数之和

解题思路:这道题和上一题非常类似,只需再加一层循环即可,这里就不多叙述了,直接放代码
代码如下





浙公网安备 33010602011771号