DEV Community

Abhishek Gupta
Abhishek Gupta

Posted on • Edited on

Linked List Operations in JavaScript: A Complete Step-by-Step Guide

🧱 1. What is a Linked List?

A Linked List is a linear data structure where elements are stored in nodes, and each node points to the next.

[value | next] β†’ [value | next] β†’ [value | null]
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Last node always points to null


πŸ”§ 2. Node Structure

function Node(value) {
  this.data = value;
  this.next = null;
}
Enter fullscreen mode Exit fullscreen mode

πŸ—οΈ 3. Linked List Class

var MyLinkedList = function () {
    this.head = null;
    this.len = 0; // MUST be 0
};
Enter fullscreen mode Exit fullscreen mode

⚠️ IMPORTANT RULES (DO NOT IGNORE)

  • Always use 0-based indexing
  • Always update len
  • Never break pointer chain
  • Always check invalid index

πŸ“Œ 4. Add At Head

πŸ–ΌοΈ Visualization

πŸ’‘ Idea

New node becomes the first node.


πŸͺœ Steps

  1. Create new node
  2. Point it to current head
  3. Move head to new node

βœ… Code

MyLinkedList.prototype.addAtHead = function (val) {
    const node = new Node(val);

    node.next = this.head;
    this.head = node;

    this.len++;
};
Enter fullscreen mode Exit fullscreen mode

⏱ Complexity

  • O(1)

πŸ“Œ 5. Add At Tail

πŸ–ΌοΈ Visualization


πŸ’‘ Idea

Go to last node β†’ attach new node


πŸͺœ Steps

  1. If empty β†’ head = node
  2. Else β†’ traverse to last
  3. Connect last.next = node

βœ… Code

MyLinkedList.prototype.addAtTail = function (val) {
    const node = new Node(val);

    if (!this.head) {
        this.head = node;
        this.len++;
        return;
    }

    let current = this.head;

    while (current.next) {
        current = current.next;
    }

    current.next = node;
    this.len++;
};
Enter fullscreen mode Exit fullscreen mode

⏱ Complexity

  • O(n)

πŸ“Œ 6. Get Value at Index

πŸ–ΌοΈ Visualization


πŸ’‘ Idea

Traverse from head to index


πŸͺœ Steps

  1. Check bounds
  2. Move step-by-step
  3. Return value

βœ… Code

MyLinkedList.prototype.get = function (index) {
    if (index < 0 || index >= this.len) return -1;

    let current = this.head;

    for (let i = 0; i < index; i++) {
        current = current.next;
    }

    return current.data;
};
Enter fullscreen mode Exit fullscreen mode

⏱ Complexity

  • O(n)

πŸ“Œ 7. Add At Index

πŸ–ΌοΈ Visualization


πŸ’‘ Idea

Reach index - 1, then insert


πŸͺœ Steps

  1. If index invalid β†’ return
  2. If index = 0 β†’ head
  3. If index = len β†’ tail
  4. Else:
  • go to index - 1
  • insert node

βœ… Code

MyLinkedList.prototype.addAtIndex = function (index, val) {
    if (index < 0 || index > this.len) return;

    if (index === 0) {
        this.addAtHead(val);
        return;
    }

    if (index === this.len) {
        this.addAtTail(val);
        return;
    }

    let prev = this.head;

    for (let i = 0; i < index - 1; i++) {
        prev = prev.next;
    }

    const node = new Node(val);
    node.next = prev.next;
    prev.next = node;

    this.len++;
};
Enter fullscreen mode Exit fullscreen mode

⏱ Complexity

  • O(n)

πŸ“Œ Delete Node at Index in Linked List (Detailed)

🧠 Core Idea

A linked list is a chain of nodes:

10 β†’ 20 β†’ 30 β†’ 40
Enter fullscreen mode Exit fullscreen mode

Each node stores:

  • value
  • next (pointer to next node)

πŸ‘‰ To delete a node, you don’t remove it directly
πŸ‘‰ You change links (pointers) so it gets skipped


🎯 Goal

Delete node at a given index

Example:

Index: 2

Before:
10 β†’ 20 β†’ 30 β†’ 40

After:
10 β†’ 20 β†’ 40
Enter fullscreen mode Exit fullscreen mode

πŸ’‘ Key Insight

πŸ‘‰ You must stop at the previous node

Because:

prev.next = prev.next.next
Enter fullscreen mode Exit fullscreen mode

This skips the node you want to delete.


πŸͺœ Step-by-Step Explanation

βœ… Step 1: Validate Index

if (index < 0 || index >= this.len) return;
Enter fullscreen mode Exit fullscreen mode

Why?

  • Negative index ❌
  • Index beyond list size ❌

βœ… Step 2: Special Case (index = 0)

Deleting head:

Before:
[10] β†’ 20 β†’ 30

After:
20 β†’ 30
Enter fullscreen mode Exit fullscreen mode

Code:

this.head = this.head.next;
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ We simply move the head forward


βœ… Step 3: Traverse to (index - 1)

Why?
Because we need the previous node

let prev = this.head;

for (let i = 0; i < index - 1; i++) {
    prev = prev.next;
}
Enter fullscreen mode Exit fullscreen mode

βœ… Step 4: Bypass the Node

prev β†’ toDelete β†’ nextNode

becomes

prev β†’ nextNode
Enter fullscreen mode Exit fullscreen mode

Code:

let toDelete = prev.next;
prev.next = toDelete.next;
Enter fullscreen mode Exit fullscreen mode

βœ… Step 5: Cleanup (Optional but Good Practice)

toDelete.next = null;
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Helps garbage collection
πŸ‘‰ Avoids accidental memory reference


βœ… Step 6: Update Length

this.len--;
Enter fullscreen mode Exit fullscreen mode

πŸ”₯ Full Code (Clean Version)

MyLinkedList.prototype.deleteAtIndex = function (index) {
    if (index < 0 || index >= this.len) return;

    if (index === 0) {
        this.head = this.head.next;
        this.len--;
        return;
    }

    let prev = this.head;

    for (let i = 0; i < index - 1; i++) {
        prev = prev.next;
    }

    let toDelete = prev.next;
    prev.next = toDelete.next;

    toDelete.next = null;

    this.len--;
};
Enter fullscreen mode Exit fullscreen mode

πŸ§ͺ Dry Run Example

Initial list:

20 β†’ 99 β†’ 10 β†’ 30
Enter fullscreen mode Exit fullscreen mode

Delete index = 1

Step 1:

Go to index - 1 = 0
prev = 20

Step 2:

toDelete = 99
Enter fullscreen mode Exit fullscreen mode

Step 3:

20.next = 10
Enter fullscreen mode Exit fullscreen mode

Final list:

20 β†’ 10 β†’ 30
Enter fullscreen mode Exit fullscreen mode

⏱ Time & Space Complexity

⏱ Time:

  • Traversal β†’ O(n)

πŸ“¦ Space:

  • No extra memory β†’ O(1)

🧠 Ultimate Pattern to Remember

Delete = Skip node

prev.next = prev.next.next
Enter fullscreen mode Exit fullscreen mode

πŸ”₯ FULL WORKING EXAMPLE

var obj = new MyLinkedList();

obj.addAtHead(10);
obj.addAtHead(20);
obj.addAtTail(30);
obj.addAtIndex(1, 99);

console.log(obj.get(1)); // 99

obj.deleteAtIndex(1);

console.log(obj.get(1)); // 10
Enter fullscreen mode Exit fullscreen mode

🧠 MONSTER LEVEL UNDERSTANDING


πŸ”‘ Core Pattern

πŸ‘‰ Always work with previous node

prev.next = prev.next.next;
Enter fullscreen mode Exit fullscreen mode

πŸ”‘ Golden Rule

Linked List = Pointer manipulation, not value shifting


πŸ”‘ Why Array vs Linked List

Feature Array Linked List
Insert O(n) O(1) (if pointer known)
Delete O(n) O(1)
Access O(1) O(n)

πŸ”‘ Most Important Interview Insight

You NEVER delete node directly
You only change links

Top comments (0)