๐Ÿ”น 0. Slice notation ([::-1])

my_list = [1, 2, 3, 4]
rev = my_list[::-1]
print(rev)   # [4, 3, 2, 1]
  • Creates a new reversed copy.
  • Time: O(n)
  • Space: O(n)

๐Ÿ”น 1. In-place reverse (mutates the list)

my_list = [1, 2, 3, 4]
my_list.reverse()
print(my_list)   # [4, 3, 2, 1]
  • Time: O(n)
  • Space: O(1) (does not create a copy)
  • Best when you donโ€™t need the original ordering preserved.

๐Ÿ”น 2. Using reversed() (iterator)

my_list = [1, 2, 3, 4]
rev_iter = reversed(my_list)    # returns iterator
print(list(rev_iter))           # [4, 3, 2, 1]
  • Time: O(1) to create the iterator, O(n) when iterating.
  • Space: O(1) (iterator doesnโ€™t copy).
  • Use this when you just need to iterate in reverse order, not store a new list.

๐Ÿ”น 3. Manual loop

my_list = [1, 2, 3, 4]
reversed_list = []
for i in range(len(my_list)-1, -1, -1):
    reversed_list.append(my_list[i])
print(reversed_list)   # [4, 3, 2, 1]
  • Educational, but not Pythonic.

๐Ÿ”น 4. Using sorted() with reverse=True

my_list = [1, 2, 3, 4]
rev = sorted(my_list, reverse=True)
print(rev)  # [4, 3, 2, 1]
  • โš ๏ธ Careful: this doesnโ€™t just reverse, it sorts descending.
  • Only correct if list is already sorted ascending.

๐Ÿ”น 5. Stack trick (pop repeatedly)

my_list = [1, 2, 3, 4]
reversed_list = [my_list.pop() for _ in range(len(my_list))]
print(reversed_list)   # [4, 3, 2, 1]
  • Works but destroys the original list.

โœ… Summary

MethodReturns copy?In-place?SpaceTime
[::-1]โœ… YesโŒ NoO(n)O(n)
.reverse()โŒ Noโœ… YesO(1)O(n)
reversed()Iterator onlyโŒ NoO(1)O(n) when consumed
Manual loopโœ… YesโŒ NoO(n)O(n)
sorted(..., True)โœ… YesโŒ NoO(n)O(n log n)