Queue using Linked List

A queue can be easily implemented as a SLL with two pointers, first and last. The trick is to remember that the arrows are kind of flipped.

last <- node <- node <- node <- first

Queue() pushes a new last
Dequeue() removes the first node.

Remember that if only one item is in the queue, head = tail; therefore if I dequeue(lastNode) I must set *both* head and tail to None.

Remember that if a dequeue() the last node, first is automatically set to None but I also have to seat last to None.

class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None

class Queue(object):
    first = None
    last = None

    def enqueue(self, value):
        new_node = Node(value)
        
        if self.first is None:
            self.first = self.last = new_node
        else:
            self.last.next = new_node
            self.last = new_node
            

    def dequeue(self):
        self.first = self.first.next
        if self.first is None:
            self.last = self.first
            print 'empty'

    
    def show(self):
        n = self.first
        while n is not None:
            print n.value,
            n = n.next
            

q = Queue()
q.enqueue('how')
q.enqueue('are')
q.enqueue('you')
q.show()
print
q.dequeue()
q.dequeue()
q.dequeue()
print
q.enqueue('!')
q.show()