Enqueueing
Sie müssen nicht die gesamte Liste durchlaufen, um das neue Ende zu finden. Sie müssen lediglich einen neuen Knoten hinzufügen, auf den das aktuelle Ende zeigt, und diesen Knoten als neues Ende festlegen.
Pseudocode (unter der Annahme, dass head != null
und tail != null
):
function enqueue(value) {
node = new Node(value) // O(1)
tail.next = node // O(1)
tail = node // O(1)
size++ // O(1)
}
Daraus können wir schließen, dass die zeitliche Komplexität ist O ( 1 ).
Dequeueing
Für die Warteschlange müssen wir nur den nächsten Knoten des aktuellen Kopfes als neuen Kopf festlegen und den Wert des alten Kopfes zurückgeben.
Hinweis : Vergessen Sie nicht, dass, wenn der neue Kopf auf eingestellt ist null
, auch der Schwanz auf eingestellt sein sollte null
:
Pseudocode (unter der Annahme, dass head != null
und 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)
}
Alle diese Operationen haben O ( 1 ) Zeitkomplexität, die die Zeitkomplexität der Dequeue-Funktion erhöht O ( 1 ) auch.
Suchen
Die Suche nach einem Wert erfolgt durch Durchsuchen aller Elemente, beginnend mit dem Kopf. Im schlimmsten Fall müssten Sie die gesamte Warteschlange durchlaufen, was die Zeitkomplexität im schlimmsten Fall erhöhtO ( n ).
Wenn Sie beispielsweise den Schwanz entfernen möchten, ist die zeitliche Komplexität hoch O ( n ). Dies ist , weil Sie den neuen Schwanz für die Warteschlange finden müßten und da der Schwanz ist nicht Zugriff auf das vorherige Element in einer einfach verketteten Liste hat, müßten Sie die gesamte Warteschlange für den neuen Schwanz suchen.
Pseudocode (unter der Annahme, dass head != null
und 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)
}
Daraus ist ersichtlich, dass die zeitliche Komplexität tatsächlich ist O ( n ).