Design Linked List

medium linked list design

Problem

Design a singly linked list class supporting: get(index), addAtHead(val), addAtTail(val), addAtIndex(index, val), deleteAtIndex(index).

InputaddAtHead(1); addAtTail(3); addAtIndex(1, 2); get(1); deleteAtIndex(1); get(1);
Output2, 3
After [1,2,3], get(1) is 2. Delete index 1 → [1,3]; new get(1) is 3.

class MyLinkedList:
    class Node:
        __slots__ = ("val", "next")
        def __init__(self, v=0, n=None): self.val = v; self.next = n
    def __init__(self):
        self.head = MyLinkedList.Node()  # sentinel
        self.size = 0
    def get(self, index):
        if index < 0 or index >= self.size: return -1
        cur = self.head.next
        for _ in range(index): cur = cur.next
        return cur.val
    def addAtIndex(self, index, val):
        if index < 0 or index > self.size: return
        prev = self.head
        for _ in range(index): prev = prev.next
        prev.next = MyLinkedList.Node(val, prev.next)
        self.size += 1
    def addAtHead(self, val): self.addAtIndex(0, val)
    def addAtTail(self, val): self.addAtIndex(self.size, val)
    def deleteAtIndex(self, index):
        if index < 0 or index >= self.size: return
        prev = self.head
        for _ in range(index): prev = prev.next
        prev.next = prev.next.next
        self.size -= 1
class MyLinkedList {
  constructor() { this.head = { val: 0, next: null }; this.size = 0; }
  get(i) {
    if (i < 0 || i >= this.size) return -1;
    let cur = this.head.next;
    while (i--) cur = cur.next;
    return cur.val;
  }
  addAtIndex(i, v) {
    if (i < 0 || i > this.size) return;
    let prev = this.head;
    while (i--) prev = prev.next;
    prev.next = { val: v, next: prev.next };
    this.size++;
  }
  addAtHead(v) { this.addAtIndex(0, v); }
  addAtTail(v) { this.addAtIndex(this.size, v); }
  deleteAtIndex(i) {
    if (i < 0 || i >= this.size) return;
    let prev = this.head;
    while (i--) prev = prev.next;
    prev.next = prev.next.next;
    this.size--;
  }
}
class MyLinkedList {
    static class Node { int val; Node next; Node(int v, Node n) { val = v; next = n; } }
    Node head = new Node(0, null); int size = 0;
    public int get(int i) {
        if (i < 0 || i >= size) return -1;
        Node cur = head.next; while (i-- > 0) cur = cur.next;
        return cur.val;
    }
    public void addAtIndex(int i, int v) {
        if (i < 0 || i > size) return;
        Node prev = head; while (i-- > 0) prev = prev.next;
        prev.next = new Node(v, prev.next); size++;
    }
    public void addAtHead(int v) { addAtIndex(0, v); }
    public void addAtTail(int v) { addAtIndex(size, v); }
    public void deleteAtIndex(int i) {
        if (i < 0 || i >= size) return;
        Node prev = head; while (i-- > 0) prev = prev.next;
        prev.next = prev.next.next; size--;
    }
}
class MyLinkedList {
    struct Node { int val; Node* next; Node(int v, Node* n): val(v), next(n) {} };
    Node* head = new Node(0, nullptr);
    int sz = 0;
public:
    int get(int i) {
        if (i < 0 || i >= sz) return -1;
        Node* cur = head->next; while (i--) cur = cur->next;
        return cur->val;
    }
    void addAtIndex(int i, int v) {
        if (i < 0 || i > sz) return;
        Node* prev = head; while (i--) prev = prev->next;
        prev->next = new Node(v, prev->next); sz++;
    }
    void addAtHead(int v) { addAtIndex(0, v); }
    void addAtTail(int v) { addAtIndex(sz, v); }
    void deleteAtIndex(int i) {
        if (i < 0 || i >= sz) return;
        Node* prev = head; while (i--) prev = prev->next;
        Node* d = prev->next; prev->next = d->next; delete d; sz--;
    }
};
Time: O(index) per op Space: O(n)