Design Linked List — Sentinel Doubly Linked List

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem 231 · Design Linked List

Difficulty: Medium · Pattern: Sentinel DLL Design

Implement: get(i), addAtHead, addAtTail, addAtIndex, deleteAtIndex.

Solutions

# Python — doubly linked list with sentinels
class Node:
    def __init__(self, val=0): self.val = val; self.prev = self.next = None

class MyLinkedList:
    def __init__(self):
        self.head = Node()  # sentinel
        self.tail = Node()  # sentinel
        self.head.next = self.tail
        self.tail.prev = self.head
        self.size = 0

    def _get_node(self, i):
        cur = self.head.next
        for _ in range(i): cur = cur.next
        return cur

    def get(self, i):
        if i < 0 or i >= self.size: return -1
        return self._get_node(i).val

    def addAtHead(self, val): self._insert_after(self.head, Node(val))
    def addAtTail(self, val): self._insert_after(self.tail.prev, Node(val))

    def addAtIndex(self, i, val):
        if i > self.size: return
        if i <= 0: self.addAtHead(val); return
        self._insert_after(self._get_node(i-1), Node(val))

    def deleteAtIndex(self, i):
        if i < 0 or i >= self.size: return
        self._remove(self._get_node(i))

    def _insert_after(self, node, new_node):
        new_node.prev = node; new_node.next = node.next
        node.next.prev = new_node; node.next = new_node
        self.size += 1

    def _remove(self, node):
        node.prev.next = node.next; node.next.prev = node.prev
        self.size -= 1

Complexity

  • get / addAtIndex / deleteAtIndex: O(n)
  • addAtHead / addAtTail: O(1)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro