Arrays and Iteration
Reverse Array In Place (Two Pointers)
Walk two indices toward each other from the ends of the array, swapping at each step. Stops when the indices meet or cross. Demonstrates the two-pointer pattern with the smallest possible state.
Algorithm
Canonical input [1, 2, 3, 4, 5, 6, 7] (odd length, middle element stays
put) yields three swap frames and reverses to [7, 6, 5, 4, 3, 2, 1].
two pointers
`left` starts at index `0`, `right` starts at `n - 1`. Each loop iteration swaps `arr(left)` and `arr(right)` and moves the pointers toward each other.
Basic Implementation
basic.scala
Replay: real traced execution (multi-file project)
object Main {
def main(args: Array[String]): Unit = {
val arr = Array(1, 2, 3, 4, 5, 6, 7)
var left = 0
var right = arr.length - 1
while (left < right) {
val tmp = arr(left)
arr(left) = arr(right)
arr(right) = tmp
left = left + 1
right = right - 1
}
println(arr.mkString("[", ", ", "]"))
}
}
arr ← [1, 2, 3, 4, 5, 6, 7]
2def main(args: Array[String]): Unit = {3 val arr = Array(1, 2, 3, 4, 5, 6, 7)4 var left = 0values this step[1, 2, 3, 4, 5, 6, 7]arrleft ← 0
3val arr = Array(1, 2, 3, 4, 5, 6, 7)4var left = 05var right = arr.length - 1values this step0left[1, 2, 3, 4, 5, 6, 7]arrright ← 6
4var left = 05var right = arr.length - 16while (left < right) {values this step6right0leftarr ← [7, 2, 3, 4, 5, 6, 1]
7val tmp = arr(left)8arr(left) = arr(right)9arr(right) = tmpvalues this step[1, 2, 3, 4, 5, 6, 7] → [7, 2, 3, 4, 5, 6, 1]arr0left6rightleft ← 1
9arr(right) = tmp10left = left + 111right = right - 1values this step0 → 1leftright ← 5
10 left = left + 111 right = right - 112}values this step6 → 5rightarr ← [7, 6, 3, 4, 5, 2, 1]
7val tmp = arr(left)8arr(left) = arr(right)9arr(right) = tmpvalues this step[7, 2, 3, 4, 5, 6, 1] → [7, 6, 3, 4, 5, 2, 1]arr1left5rightleft ← 2
9arr(right) = tmp10left = left + 111right = right - 1values this step1 → 2leftright ← 4
10 left = left + 111 right = right - 112}values this step5 → 4rightarr ← [7, 6, 5, 4, 3, 2, 1]
7val tmp = arr(left)8arr(left) = arr(right)9arr(right) = tmpvalues this step[7, 6, 3, 4, 5, 2, 1] → [7, 6, 5, 4, 3, 2, 1]arr2left4rightleft ← 3
9arr(right) = tmp10left = left + 111right = right - 1values this step2 → 3leftright ← 3
10 left = left + 111 right = right - 112}values this step4 → 3rightwhile (left < right)
5var right = arr.length - 16while (left < right) {7 val tmp = arr(left)values this step[7, 6, 5, 4, 3, 2, 1]arr3left3right
Complexity
- Time: O(n)
- Space: O(1)
Implementation notes
- Scala: explicit three-line
val tmp = arr(left); arr(left) = arr(right); arr(right) = tmpswap keeps the move visible. The stdlibarr.reverse(orArray.copyOfwith a reversed range) would hide the lesson. var left = 0andvar right = arr.length - 1use plainIntindices; theleft < rightguard handles the meet-in-the-middle exit honestly for the odd-length canonical input.- The replay shows both
leftandright, the values about to be swapped, and the array contents after the swap. The loop-exit frame is the moment the pointers meet.