Almost identical to Singly Linked Lists, except every node has another pointer, to the previous node!
null
null
next
next
next
prev
prev
prev
12
9
5
14
More memory === More Flexibility
It's almost always a tradeoff!
Adding a node to the end of the Doubly Linked List
Removing a node from the end of the Doubly Linked List
Removing a node from the beginning of the Doubly Linked List
Adding a node to the beginning of the Doubly Linked List
Accessing a node in a Doubly Linked List by its position
Replacing the value of a node to the in a Doubly Linked List
Adding a node in a Doubly Linked List by a certain position
Removing a node in a Doubly Linked List by a certain position
Reversing a Doubly Linked List in place!
Insertion - O(1)
Removal - O(1)
Searching - O(N)
Access - O(N)
Technically searching is O(N / 2), but that's still O(N)