Mental Model
Access the tail directly and unlink it from the previous node using the prev pointer, then update tail to the previous node for O(1) removal.
Analogy: Imagine a train with carriages linked front and back. To remove the last carriage, detach it from the previous one using the backward link, and declare the previous as the new end.
head -> 1 ↔ 2 ↔ 3 ↔ 4 ↔ 5 <- tail null <- 1 ↔ 2 ↔ 3 ↔ 4 ↔ 5 -> null
