CP
Data Structures

Doubly Linked List

class Node:
    def __init__(self, key: int = None, value: int = None):
        self.key = key
        self.value = value
        self.next = None
        self.prev = None
        
class DLL:
    def __init__(self):
        self.head = Node()
        self.tail = Node()
        self.head.next = self.tail
        self.tail.prev = self.head

    def insert(self, node: Node) -> None:
        pre, nxt = self.head, self.head.next
        node.prev = pre
        node.next = nxt
        pre.next = node
        nxt.prev = node
    
    def remove(self, node: Node) -> int:
        pre, nxt = node.prev, node.next
        pre.next = nxt
        nxt.prev = pre
        return node.key

    def last(self) -> Optional[Node]:
        pre = self.tail.prev
        return pre if pre != self.head else None