Я понимаю, что этот поток давно мертв, но я считаю, что нашел довольно хорошее решение, которое отвечает всем требованиям.
Вам понадобится только одна временная очередь. То, что вы делаете, пока исходная очередь не пуста, вы перемещаете последний узел в очереди вперед, устанавливая указатель на последний узел и запрашивая и повторно вводя узлы в исходную очередь.
Затем вы удаляете очередь из исходной очереди и ставите ее во временную очередь.
После этого вы просто копируете темп обратно в исходную очередь.
Вот мое решение в стиле C, ADT:
(По крайней мере, мне не нужно беспокоиться о том, чтобы делать за тебя домашнее задание)
QUEUE * reverseQueue (QUEUE * очередь)
{
QUEUE *temp;
QUEUE_NODE *pLast;
void *dataPtr;
//Check for empty queue
if(emptyQueue(queue))
return NULL;
//Check for single node queue
if(queueCount(queue) == 1)
return queue;
temp = createQueue();
while(!emptyQueue(queue))
{
pLast = queue->rear;
//Move last node to front of queue
while(queue->front != pLast)
{
dequeue(queue, &dataPtr);
enqueue(queue, dataPtr);
}
//Place last node in temp queue
dequeue(queue, &dataPtr);
enqueue(temp, dataPtr);
}
//Copy temp queue back to original queue
while(!emptyQueue(temp))
{
dequeue(temp, &dataPtr);
enqueue(queue, dataPtr);
}
destroyQueue(temp);
return queue;
}