以下の変更とコメントを参照してください。
QUEUE(x):
if L.head == NIL:
x.prev = x.next = NIL // otherwise you never set up next
L.head = x
else
cur = L.head
while cur.next != NIL
cur = cur.next
cur.next = x
x.prev = cur
x.next = NIL
DEQUEUE():
// handle empty queue
if L.head == NIL:
ERROR! // or something
else
x = L.head
L.head = x.next
if x.next != NIL: // handle empty queue
x.next.prev = L.head NIL // otherwise it points to itself
return x
O(1)を作成するQUEUE(x)
には、末尾へのポインタを保持する必要があります。
QUEUE(x):
if L.head == NIL:
x.prev = NIL
L.head = L.tail = x
else
cur = L.tail
cur.next = L.tail = x
x.prev = cur
x.next = NIL
DEQUEUE():
if L.head == NIL:
ERROR! // or something
else
x = L.head
L.head = x.next
if x.next != NIL:
x.next.prev = NIL
else
L.tail = NIL
return x
また、二重リンクリストは実際には必要ありません。単一リンクのリストは問題なく動作するはずです (他の操作もサポートしたい場合を除きます)。