A singly linked list links each node only to the next node; a doubly linked list links each node both forwards and backwards; and a circular linked list connects the final node back to an earlier node, normally the head.
Each linked list consists of nodes containing data and one or more references. A head reference identifies the first node, while a tail may identify the final node.
| Type | Node structure and traversal | Main implications |
|---|---|---|
| Singly linked list | Each node stores data and a next reference. The tail's next reference is null. Traversal is forwards only. | Uses less memory per node, but moving backwards is not directly possible. Deleting a node normally requires access to its predecessor. |
| Doubly linked list | Each node stores next and previous references. Traversal works in both directions. | Uses more memory and requires more references to be updated during insertion or deletion, but backward traversal and deletion are easier. |
| Circular linked list | The tail's next reference points to the head instead of null. It may be singly or doubly linked. | Traversal can repeatedly cycle through nodes, which is useful for round-robin scheduling. An explicit stopping condition prevents an infinite loop. |
For example, inserting node C between A and B in a singly linked list requires changing A.next to C and C.next to B. In a doubly linked list, C.previous, C.next, A.next, and B.previous must all be updated.
A common misconception is that “circular” is a third mutually exclusive node structure. It is not: circularity describes how the final node connects, so a list can be both .