一、快慢指针
- 两个指针,分别以不同的步长移动
1.可以用来移动列表内的元素
例如,给定一个列表
nums = [1,0,2,0,3]
将0移动到列表的末尾
快指针 f
慢指针 s
初始值都为0
- 此时快指针所对应的元素不为0,快慢指针向后移动
f s | ||||
---|---|---|---|---|
1 | 0 | 2 | 0 | 3 |
- 此时快指针对应元素为0,快指针向后移动
f s | ||||
---|---|---|---|---|
1 | 0 | 2 | 0 | 3 |
- 将快指针和慢指针对应的元素调换
s | f | |||
---|---|---|---|---|
1 | 0 | 2 | 0 | 3 |
- 此时快指针对应元素为0,快指针向后移动
s | f | |||
---|---|---|---|---|
1 | 2 | 0 | 0 | 3 |
- 此时快指针对应元素不是0,快慢指针元素调换
s | f | |||
---|---|---|---|---|
1 | 2 | 0 | 0 | 3 |
- 调换后结果如下,如果继续移动快指针,则超出范围,结束循环
s | f | |||
---|---|---|---|---|
1 | 2 | 3 | 0 | 0 |
- 源代码如下:
nums = [1,0,2,0,3]
s = 0
f = 0
while f < len(nums):
if nums[f] == 0:
f += 1
else:
nums[f],nums[s] = nums[s],nums[f]
s += 1
f += 1
- 输出nums的结果为
[1, 2, 3, 0, 0]
2.可以用来判断链表是否有环
如果链表有环,当慢指针也进入环的时候,快慢指针总会相遇。