引言
常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。
对撞指针:一般用于顺序结构中,也称左右指针。从两端向中间移动。终止条件一般是两个指针相遇或者错开(left == right 或 left > right)。 快慢指针:又称为龟兔赛跑算法,基本思想是使用两个移动速度不同的指针在数组或链表等序列结构上移动。常用于处理循环往复的情况。 ***注意:***这里的指针并不是 C 语言中的地址指针,而是用变量记录数组下标。
283. 移动零
题目描述

实现核心及思路
解题思路: 对撞指针方案行不通,因为题目要求移动 0 元素的同时还要保证非零元素的相对顺序。采用两个指针都从数组的左端出发,把非零的元素依次找到放在前面,最后剩下 0 自然就排在数组后面了。
- 刚开始让一个指针 cur 先指向数组的第一个元素,另一个指针 dest 初始化为 -1。cur 用来找非零元素,dest 用来确定 cur 之前的 0 元素。
- 当 cur 指向的元素为零则 cur++,继续向后找非零元素来将前面的 0 交换到后面;
- 当 cur 指向的元素不为 0,则让 dest 向前移动一位(dest++),然后交换 cur 和 dest 指向的元素,cur 继续向后移动(cur++)。
- 结束条件:当 cur 走到数组尾部的时候意味着所有非零元素都找到了,结束。
思路可视化:

代码实现:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int size = nums.size();
int dest = -1;
int cur = 0;
(cur < size) {
(nums[cur] != ) {
dest++;
(nums[dest], nums[cur]);
}
cur++;
}
}
};










