双指针使用总结

199 阅读2分钟

一、双指针介绍

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

二、双指针使用技巧

对撞指针

比如翻转字符串,在分别将双指针分别指向数组的开头和末尾,然后将其指向的元素进行交换,之后再将指针向前移动,继续交换,直到两个指针相遇。

例子如下

  • 定义左右指针leftright, left的值为0, right的值为长度减1
  • 分别将两个指针leftright指向数组的开头及末尾,然后将其指向的元素进行交换,再将指针向中间移动一步,继续交换,直到leftright两个指针相遇。
  • 最后返回数组arr
let left = 0, right = s.length - 1;
  while(left <= right) {
    let newNum = s[left]
        s[left] = s[right]
        s[right] = newNum
        left++
        right--
    }
    return s
}

快慢指针

快慢指针也都是定义两个指针,但是它与对撞指针是有区别的,对撞指针分别指向数组的开头和结尾,但是快慢指针都指向同一个方向。 快慢指针中会初始化一个快指针fast和慢指针slow,每当快指针fast移动时都要去进行判断,判断通过然后移动快指针fast。

题解思路:

  • 定义快慢双指针fastslow,如果快指针遍历的数据不等于val时,慢指针向前移动一位,
  • 如果快指针fast等于val时,则慢指针slow不动,然后继续移动快指针fast
let removeElement = function(nums, val) {

  /**
   * 快慢指针
   * 
   * 定义快慢指针fast和slow,对快指针进行比较,如果快指针不等于val时
   * 移动慢指针,并将快指针fast的参数赋值给慢指针slow,
   * 如果快指针的参数等于val,那么就直接继续快指针加1
   * 知道快指针移动到最后一位,结束运动
   * */ 
let fast = 0, slow = 0, len = nums.length
  
 while (fast < len) {
    if(nums[fast] != val) {
      nums[slow] = nums[fast]
      slow++
      fast++
    } else {
      fast++
    }
  }
  return slow
}

以上是所有内容,欢迎点赞,收藏!!! 如有不足支持,请留言!!!感谢!!!