Design Linked List — Sentinel Doubly Linked List
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