例题:
输入:10,20,30,40,50,60,70,80,90,100和k=5
输出:50,40,30,20,10,60,70,80,90,100
思路:
方法1:
- 创建一个空堆栈。
- 从给定队列中逐个取消排队的第一个 K 个项目,并将取消排队的项目推送到堆栈。
- 将堆栈的内容排在队列的后面
- 从前面取消排队 (size-k) 元素,并将它们一个接一个地排队到同一个队列。
时间复杂度: O(N + k),其中“n”是队列中的元素总数,“k”是要反转的元素数。这是因为首先将整个队列清空到堆栈中,然后以相同的方式清空和排队。
辅助空间:O(k),其中 k 是要反转的元素,因为堆栈用于存储值以反转。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class test {
static Queue<Integer> queue;
static void reverseQueueFirstKElements(int k)
{
if (queue.isEmpty() == true || k > queue.size())
return;
if (k <= 0)
return;
Stack<Integer> stack = new Stack<Integer>();
// 将前k个元素取出入栈
for (int i = 0; i < k; i++) {
stack.push(queue.peek());
queue.remove();
}
// 将栈中的元素压入队列中,这样前k个元素已经倒序,在队列的尾部
while (!stack.empty()) {
queue.add(stack.peek());
stack.pop();
}
// 将不需要倒序的元素按顺序添加到尾部
for (int i = 0; i < queue.size() - k; i++) {
queue.add(queue.peek());
queue.remove();
// queue.add(queue.remove());
}
}
static void Print()
{
while (!queue.isEmpty()) {
System.out.print(queue.peek() + " ");
queue.remove();
}
}
// Driver code
public static void main(String args[])
{
queue = new LinkedList<Integer>();
queue.add(10);
queue.add(20);
queue.add(30);
queue.add(40);
queue.add(50);
queue.add(60);
queue.add(70);
queue.add(80);
queue.add(90);
queue.add(100);
int k = 5;
reverseQueueFirstKElements(k);
Print();
}
}