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()