A circular list may be implemented using a fixed-size array (a ring buffer) or a linked list.
In a circularly linked list, all nodes are linked in a continuous circle, without using null. For lists with a front and a back (such as a queue), one stores a reference to the last node in the list. The next node after the last node is the first node. Elements can be added to the back of the list and removed from the front in constant time.
Circularly linked lists can be either singly or doubly linked.
Both types of circularly linked lists benefit from the ability to traverse the full list beginning at any given node. This often allows us to avoid storing
lastNode, although if the list may be empty we need a special representation for the empty list, such as a
lastNode variable which points to some node in the list or is null if it's empty; we use such a
lastNode here. This representation significantly simplifies adding and removing nodes with a non-empty list, but empty lists are then a special case.