Enfileiramento
Você não precisa percorrer a lista inteira para encontrar a nova cauda, basta adicionar um novo nó para onde a cauda atual aponta e definir esse nó como a nova cauda.
Pseudocódigo (assumindo que head != null
e tail != null
):
function enqueue(value) {
node = new Node(value) // O(1)
tail.next = node // O(1)
tail = node // O(1)
size++ // O(1)
}
A partir do qual podemos concluir que a complexidade do tempo é .O ( 1 )
Retirar da fila
Para desenfileirar, precisamos apenas definir o próximo nó da cabeça atual como a nova cabeça e retornar o valor da cabeça antiga.
Nota : Não esqueça que se o novo cabeçote estiver definido como null
, a cauda também deverá estar definida null
:
Pseudocódigo (assumindo que head != null
e tail != null
):
function dequeue() {
value = head.value // O(1)
head = head.next // O(1)
size-- // O(1)
if (head == null) { // O(1)
tail = null // O(1)
}
return value // O(1)
}
Todas essas operações possuem complexidade de tempo , o que torna a complexidade de tempo da função de desenfileiramento também.O ( 1 )O ( 1 )
Procurando
A busca de um valor é feita percorrendo todos os itens, começando pela cabeça. No pior cenário, você precisaria atravessar a fila inteira, o que torna a complexidade do pior caso .O ( n )
Por exemplo, se você deseja remover a cauda, a complexidade do tempo seria . Isso ocorre porque você precisaria encontrar a nova cauda para a fila e, como a cauda não tem acesso ao elemento anterior em uma lista vinculada individualmente, seria necessário procurar a nova cauda na fila inteira.O ( n )
Pseudocódigo (assumindo que head != null
e tail != null
):
function removeLast() {
// Edge case when there is only 1 element in the queue.
if (head == tail) { // O(1)
value = head.value // O(1)
head = null // O(1)
tail = null // O(1)
return value // O(1)
}
// Searching for the new tail.
newTail = head // O(1)
while (newTail.next != tail) { // O(n)
newTail = newTail.next // O(1)
}
value = tail.value // O(1)
newTail.next = null // O(1)
tail = newTail // O(1)
return tail // O(1)
}
A partir do qual se pode observar que a complexidade do tempo é de fato .O ( n )