エンキュー
新しい尾を見つけるためにリスト全体を走査する必要はありません。現在の尾が指す新しいノードを追加し、そのノードを新しい尾として設定するだけです。
疑似コード(head != null
およびそれを想定tail != null
):
function enqueue(value) {
node = new Node(value) // O(1)
tail.next = node // O(1)
tail = node // O(1)
size++ // O(1)
}
ここから、時間の複雑さはと結論付けることができます。O (1 )
デキュー
デキューするには、現在のヘッドの次のノードを新しいヘッドとして設定し、古いヘッドの値を返すだけです。
注:新しいヘッドがに設定されているnull
場合、テールnull
も同様に設定する必要があることを忘れないでください。
疑似コード(head != null
およびそれを想定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)
}
これらすべての操作には時間の複雑さがあり、デキュー関数の時間複雑もになります。O (1 )O(1)
探す
値の検索は、先頭から開始してすべてのアイテムをトラバースすることによって行われます。最悪のシナリオでは、キュー全体をトラバースする必要があるため、最悪の場合の時間はます。O(n)
たとえば、テールを削除する場合、時間の複雑さはます。これは、キューの新しいテールを見つける必要があり、テールが単一リンクリストの前の要素にアクセスできないため、キュー全体で新しいテールを検索する必要があるためです。O(n)
疑似コード(head != null
およびそれを想定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)
}
これから、時間の複雑さは確かにがわかります。O(n)