Skip to main content
Back to problems
#641
Medium Algorithms

Design circular deque

Array Linked List Design Queue
64.4% acceptance
Feb 20, 2026
1682
108
Design your implementation of the circular double-ended queue (deque).

Solution

Rust
Time O(2^n)
Space O(n)
LeetCode
solution.rs
struct MyCircularDeque {
  data: Vec<i32>,
  front: usize,
  rear: usize,
  size: usize,
  capacity: usize,
}

impl MyCircularDeque {
  fn new(k: i32) -> Self {
    let cap = k as usize;
    MyCircularDeque {
      data: vec![0; cap],
      front: 0,
      rear: cap - 1,
      size: 0,
      capacity: cap,
    }
  }

  fn insert_front(&mut self, value: i32) -> bool {
    if self.is_full() { return false; }
    self.front = (self.front + self.capacity - 1) % self.capacity;
    self.data[self.front] = value;
    self.size += 1;
    true
  }

  fn insert_last(&mut self, value: i32) -> bool {
    if self.is_full() { return false; }
    self.rear = (self.rear + 1) % self.capacity;
    self.data[self.rear] = value;
    self.size += 1;
    true
  }

  fn delete_front(&mut self) -> bool {
    if self.is_empty() { return false; }
    self.front = (self.front + 1) % self.capacity;
    self.size -= 1;
    true
  }

  fn delete_last(&mut self) -> bool {
    if self.is_empty() { return false; }
    self.rear = (self.rear + self.capacity - 1) % self.capacity;
    self.size -= 1;
    true
  }

  fn get_front(&self) -> i32 {
    if self.is_empty() { -1 } else { self.data[self.front] }
  }

  fn get_rear(&self) -> i32 {
    if self.is_empty() { -1 } else { self.data[self.rear] }
  }

  fn is_empty(&self) -> bool {
    self.size == 0
  }

  fn is_full(&self) -> bool {
    self.size == self.capacity
  }
}