What's the advantage of two pointers linked list implementation of Queue versus one pointer circular list
If you're not using a circular list, then you must have a pointer to head and tail to achieve $O(1)$ enqueue and dequeue. Furthermore, if it is not a circular list and not a doubly-linked list, then without a pointer to head, we can't enqueue!

Some picture might help a little too.


Single Linked List with only tail pointer:



There's no way to get back to the head to enqueue! We would have to remedy this with a pointer to the head.
Doubly Linked List with only tail pointer:



We can get back to the head, but at an $O(n)$ cost, we might as well just add another pointer to head for convenience.
Single Circular Linked List with only tail pointer:



We can get back to the head in $O(1)$! This is a good shortcut. In circular linked lists this node can sometimes implemented as a Sentinel Node which does not contain any information but works as a separator between the head and tail of the queue.


In terms of additional space, adding tail or head or both is almost negligible. The nodes will be taking up memory no matter what, it's just whether or not you use a variable to reference them. Using a circular linked list kind of acts like a head pointer if you think about it. tail.next would be a synonym for head, so it's not really saving space, nor is it really costing much space.