
本文聚焦 LeetCode'原地复写零'经典题目,核心需求是在固定长度数组中复写每个 0 并右移其余元素,且需满足原地修改、不使用额外数组空间的约束。正向遍历易导致后续元素被覆盖,为此详解双指针 + 逆向填充的优雅解法。
思路分析
复写零这道题的核心难点在于如何在原数组上操作而不丢失数据。如果从前向后遍历,后面的元素会被新写入的 0 覆盖。因此,我们需要先找到被复写的最后一个元素的位置,然后从后往前进行填充。
1. 确定边界位置
定义两个指针:cur 用于遍历原数组,pre 模拟复写后的数组指针。
- 当
arr[cur] == 0时,pre向后移动两位(因为一个 0 会变成两个); - 当
arr[cur] != 0时,pre向后移动一位。
当 pre >= n - 1 时,说明已经触及或超过数组末尾,此时 cur 指向的就是需要处理的最后一个有效元素。

边界情况处理:
有一种特殊情况是 pre == n,这意味着要复写的最后一个元素是一个 0,它会导致数组溢出。此时需要将数组最后一位强制改为 0,同时调整 cur 和 pre 指针回退。

2. 逆向填充
确定好边界后,从 cur 向前遍历:
- 如果当前元素不为 0,直接复制到
pre位置; - 如果当前元素为 0,则
pre和pre-1位置都填入 0。




