双指针指用两个不同速度或不同方向的指针对数组或对象进行访问,通过两个不同指针的碰撞从而达到特定的目的。
在时间或空间条件有限的情况下使用单向遍历需要消耗大量的时间或者根本无法解决问题,这时候就需要我们使用双指针,通过指针的碰撞判断是否达到条件,从而解决问题。
一、左右指针
左右指针通常用在有序数组中,通过从数组两端向中间移动,对满足特定条件的成对元素进行处理。
例如,下面这道反转字符串的题
力扣https://leetcode.cn/problems/reverse-string/
通过从数组的两端开始,将两端的元素依次交换,直到两指针相等,这样,字符串的反转就完成了。
二、快慢指针
快慢指针指通过两个移动速度不同的指针对元素进行处理。
例如,下面这道移除元素的题
力扣https://leetcode.cn/problems/remove-element/description/ 可以定义两个指针,移动速度快的指针用来判断元素的值是否等于val,移动速度慢的指针用来将它前面的元素变为不等于val的元素。
当移动速度快的指针的值不等于val时,移动速度快的指针的值赋给移动速度慢的指针,该指针++。