rotateLeft method

void rotateLeft(
  1. int shiftAmount, {
  2. int? start,
  3. int? end,
})

Rotates the List in-place in O(n) time and O(1) space.

If shiftAmount is positive, rotates elements to the left. If negative, rotates elements to the right.

Rotates elements in the range start (inclusive) to end (exclusive). If unspecified, start defaults to 0 and end defaults to the length of the List.

Implementation

void rotateLeft(int shiftAmount, {int? start, int? end}) {
  start ??= 0;
  end ??= length;
  assert(start >= 0);
  assert(start <= end);
  assert(end <= length);

  var rotatedLength = end - start;
  if (rotatedLength == 0) {
    // Nothing to rotate.
    return;
  }

  shiftAmount %= rotatedLength;
  assert(shiftAmount >= 0);

  var splitIndex = start + rotatedLength - shiftAmount;
  reverseRange(start, end);
  reverseRange(start, splitIndex);
  reverseRange(splitIndex, end);
}