Fork me on GitHub

双指针

一、链表

1. 链表的环

判断是否存在环:

  1. 多个结点的后继指针重复;
  2. 使用两个移动速度不同的指针,若相遇则存在环。循环条件(fast != None) && (fast.next != None)

寻找环入口:

  1. 快慢指针相遇出就是环的入口;
  2. fast指针的移动速度为slow指针的两倍。

2. 移除重复元素

  1. 指针1指向不重复的最后一个结点;
  2. 指针2依次扫描,若不重复则更新指针1,否则移除。

3. 倒数第n个结点

  1. fast指针先走n步;
  2. fast与slow指针同时以步长 为1的速度向前走;
  3. fast走到链表尾时slow指针指向倒数第n个结点。

4. 拆分链表

二、数组

寻找连续子序列

使用start,end两个指针记录下标

2.移除重复元素

  1. 指针1指向不重复的最后一个元素;
  2. 指针2依次扫描,若不重复则更新指针1,否则移除。

3. 寻找中点或中位数

两个指针由两端向中间移动。