
本文详解数组反转中经典的“临时变量三步交换法”,阐明 start 和 end 代表索引而非值,通过暂存、覆写、回填三步避免数据丢失,并结合图示与代码说明其工作原理和边界条件。
本文详解数组反转中经典的“临时变量三步交换法”,阐明 `start` 和 `end` 代表索引而非值,通过暂存、覆写、回填三步避免数据丢失,并结合图示与代码说明其工作原理和边界条件。
在数组原地反转(in-place reversal)中,最核心的操作是交换对称位置的两个元素——例如索引 0 与 n-1、1 与 n-2……直到两指针相遇。而实现安全交换的关键,正是你看到的这三行代码:
temp = arr[start]; // ① 将左端元素暂存到临时变量 arr[start] = arr[end]; // ② 将右端元素赋值给左端位置 arr[end] = temp; // ③ 将暂存的左端元素赋值给右端位置
为什么不能直接写 arr[start] = arr[end]?因为那样会永久丢失 arr[start] 的原始值。试想数组 [2, 7, 6, 9],若跳过 temp 直接执行:
arr[0] = arr[3]; // → arr[0] 变成 9,原值 2 彻底消失! arr[3] = arr[0]; // → arr[3] 还是 9,结果变成 [9, 7, 6, 9] —— 错误!
而使用 temp 后,过程清晰可控:
- 初始:
arr = [2, 7, 6, 9],start=0,end=3 - 步骤①:
temp = arr[0] → temp = 2 - 步骤②:
arr[0] = arr[3] → arr = [9, 7, 6, 9] - 步骤③:
arr[3] = temp → arr = [9, 7, 6, 2]✅ 成功交换
注意:start 是循环终止条件,它判断的是索引大小关系,而非数组元素值大小。当 start 从 0 递增、end 从 length-1 递减时,该条件确保:
- 不重复交换(如
start == end时为中点,无需操作); - 不越界交叉(如
start > end时已处理完毕)。
完整反转流程可视化(以 [1,2,3,4,5,6] 为例):
初始:[1,2,3,4,5,6] start=0, end=5 → 交换 arr[0]↔arr[5] → [6,2,3,4,5,1] 第二轮:[6,2,3,4,5,1] start=1, end=4 → 交换 arr[1]↔arr[4] → [6,5,3,4,2,1] 第三轮:[6,5,3,4,2,1] start=2, end=3 → 交换 arr[2]↔arr[3] → [6,5,4,3,2,1] 第四轮:start=3, end=2 → 3 <p>? <strong>关键总结</strong>: </p>
-
start和end始终是整数索引(位置编号),不是数组中的值; -
temp是必需的中间容器,保障交换的原子性与数据完整性; - 循环条件
start 精确控制交换范围,适用于任意长度数组(奇数长度时中间元素自动跳过); - 该模式广泛用于旋转数组、字符串反转、双指针算法等场景,是基础但不可替代的编程范式。










