Learn how to reverse the last k elements in a queue.
Given a queue with n elements and an number k we have to reverse the last k elements of the queue.
Example
Input: 1 2 3 4 5 3 Output: 1 3 5 4 3
There are two ways to solve this problem.
- Using stack.
- Using linked list.
Reverse last k elements of a queue using stack.
Stack stores the data in LIFO order so we can use it to reverse any type data.
Implementation
- Shift the elements to the front which are not be reversed.
- Copy the elements in the stack
- Again copy the elements from the stack back.
const reverseQueue = (queue, k) => {
let n = queue.size();
//If out of range then return the original queue
if (k > n || k < 1) {
return queue;
}
let stack = [];
//Get the last n - k elements
for (let i = 0; i < n - k; i++) {
stack.push(queue.front());
queue.dequeue();
}
//Move the last n - k elements to the first
for (let i = 0; i < n - k; i++) {
queue.enqueue(stack.pop());
}
//Add all the elements to the stack
for (let i = 0; i < n; i++) {
stack.push(queue.dequeue());
}
//Copy the reversed list back to the queue
for (let i = 0; i < n; i++) {
queue.enqueue(stack.pop());
}
//Return queue
return queue;
};
Input:
let queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
let newQueue = reverseQueue(queue, 3);
while (!newQueue.isEmpty()) {
console.log(newQueue.dequeue());
}
Output:
1
2
5
4
3
Time complexity: O(n + k).
Space complexity: O(n).
Reverse the last k elements using linked list.
Linked list stores the data the same way the queue stores it that is in FIFO order.
So we will copy the elements in the linked list and then reverse the list and copy back the reversed elements back to the queue.
const reverseQueueUsingLinkedList = (queue, k) => {
let n = queue.size();
//If out of range then return the original queue
if (k > n || k < 1) {
return queue;
}
let ll = new linkedlist();
//Move the n - k elements to first
for (let i = 0; i < n - k; i++) {
let k = queue.front();
queue.enqueue(queue.dequeue());
}
//Copy the k elements to the linked list
for (let i = 0; i < k; i++) {
let k = queue.front();
ll.append(k);
queue.dequeue();
}
//Reverse the linkedlist and copy the reversed elements back to queue
let reversedLL = reverseLL(ll.getHead());
let current = reversedLL;
while (current) {
queue.enqueue(current.element);
current = current.next;
}
return queue;
};
//Reverse linked list
const reverseLL = (head) => {
let current = head;
let previous = null,
next = null;
while (current) {
previous = current;
current = current.next;
previous.next = next;
next = previous;
}
return next;
};
Input:
let queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
let newQueue = reverseQueueUsingLinkedList(queue, 3);
while (!newQueue.isEmpty()) {
console.log(newQueue.dequeue());
}
Output:
1
2
5
4
3
Time complexity: O(n + k).
space complexity: O(n).