Bidirectional traversal and in-place edits
A doubly linked list node holds a value, a next pointer, and a previous pointer. This bidirectional structure enables traversal in both directions and crucially, enables insertion and deletion in O(1) time given a node pointer, without scanning. A singly linked list requires a preceding node to delete; a doubly linked list does not.
This property makes doubly linked lists the foundation of LRU (Least Recently Used) caches. When a cache item is accessed, it is moved to the front of the list in O(1). When eviction is needed, the least recently used item (at the back) is removed in O(1). A hash map stores node pointers for O(1) lookups, completing the cache.
Deques and advanced operations
A doubly linked list naturally supports deque (double-ended queue) operations: push/pop from both front and back in O(1). This is faster than resizable arrays for heavy deque workloads because array resizing is O(n). Splice operations (transferring a sublist from one list to another) also run in O(1) with proper pointer updates.
Memory overhead is higher than arrays (extra pointer per node), and cache locality is poor compared to contiguous storage. For workloads with frequent insertions/deletions in the middle or bidirectional traversal, the O(1) operations justify the overhead. For simple iteration or sequential access, arrays are superior.