Skip to content

Instantly share code, notes, and snippets.

@UltiRequiem
Created January 12, 2026 02:54
Show Gist options
  • Select an option

  • Save UltiRequiem/1ad7680986481f2dfda566447f9e0013 to your computer and use it in GitHub Desktop.

Select an option

Save UltiRequiem/1ad7680986481f2dfda566447f9e0013 to your computer and use it in GitHub Desktop.
Cool Linked List
class Node:
def __init__(self, val: int, next = None, prev = None):
self.val = val
self.next = next
self.prev = prev
class LinkedList:
def __init__(self):
self.size = 0
self.sentinel = Node(0)
self.sentinel.next = self.sentinel
self.sentinel.prev = self.sentinel
def get(self, index: int) -> int:
if index < 0 or index >= self.size:
return - 1
node = self._get_node(index)
return node.val
def addAtHead(self, val: int) -> None:
self._insert_after(self.sentinel, val)
def addAtTail(self, val: int) -> None:
self._insert_after(self.sentinel.prev, val)
def addAtIndex(self, index: int, val: int) -> None:
if index < 0:
index = 0
if index > self.size:
return
prev = self.sentinel if index == 0 else self._get_node(index - 1)
self._insert_after(prev, val)
def deleteAtIndex(self, index: int) -> None:
if index < 0 or index >= self.size:
return
node = self._get_node(index)
self._remove(node)
def _remove(self, node: Node):
node.prev.next = node.next
node.next.prev = node.prev
self.size -= 1
def _insert_after(self, prev: Node, val: int) -> None:
node = Node(val, prev.next, prev)
prev.next.prev = node
prev.next = node
self.size += 1
def _get_node(self, index: int):
curr = self.sentinel
if index < self.size // 2:
for _ in range(index + 1):
curr = curr.next
else:
for _ in range(self.size - index):
curr = curr.prev
return curr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment