+ public dequeue (bucket?: number): T | undefined {
+ let tail: PriorityQueueNode<T> | undefined = this.tail
+ let tailChanged = false
+ if (bucket != null && bucket > 0) {
+ let currentBucket = 1
+ while (tail != null) {
+ if (currentBucket === bucket) {
+ break
+ }
+ ++currentBucket
+ tail = tail.next
+ }
+ tailChanged = tail !== this.tail
+ }
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const data = tail!.dequeue()
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ if (tail!.empty()) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ if (!tailChanged && tail!.next != null) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ this.tail = tail!.next
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ delete tail!.next
+ } else if (tailChanged) {
+ let node: PriorityQueueNode<T> | undefined = this.tail
+ while (node != null) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ if (node.next === tail && tail!.next != null) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ node.next = tail!.next
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ delete tail!.next
+ break
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ } else if (node.next === tail && tail!.next == null) {
+ delete node.next
+ this.head = node
+ break
+ }
+ node = node.next
+ }
+ }
+ }
+ return data