Bird
Raised Fist0
DSA Typescriptprogramming

Delete Node by Value in DSA Typescript

Choose your learning style10 modes available
Mental Model
To remove a node with a specific value, find it by moving through the list, then change the previous node to skip it.
Analogy: Imagine a chain of paper clips linked together. To remove one clip, you unhook the clip before it and link it directly to the clip after the one you want to remove.
head -> 1 -> 2 -> 3 -> 4 -> null
          ↑
Dry Run Walkthrough
Input: list: 1 -> 2 -> 3 -> 4 -> null, delete value 3
Goal: Remove the node containing value 3 from the list
Step 1: Check if head node has value 3
head -> [1] -> 2 -> 3 -> 4 -> null
Why: We start at the head to see if it needs to be deleted
Step 2: Move to next node since head is not 3
head -> 1 -> [2] -> 3 -> 4 -> null
Why: Keep searching for the node with value 3
Step 3: Next node has value 3, prepare to delete it
head -> 1 -> 2 -> [3] -> 4 -> null
Why: Found the node to delete
Step 4: Change node with value 2 to point to node with value 4, skipping 3
head -> 1 -> 2 -> 4 -> null
Why: By skipping 3, it is removed from the list
Result:
head -> 1 -> 2 -> 4 -> null
Annotated Code
DSA Typescript
class Node {
  value: number;
  next: Node | null;
  constructor(value: number) {
    this.value = value;
    this.next = null;
  }
}

class LinkedList {
  head: Node | null;
  constructor() {
    this.head = null;
  }

  append(value: number): void {
    const newNode = new Node(value);
    if (!this.head) {
      this.head = newNode;
      return;
    }
    let curr = this.head;
    while (curr.next) {
      curr = curr.next;
    }
    curr.next = newNode;
  }

  deleteByValue(value: number): void {
    if (!this.head) return; // empty list

    if (this.head.value === value) {
      this.head = this.head.next; // remove head
      return;
    }

    let curr = this.head;
    while (curr.next && curr.next.value !== value) {
      curr = curr.next; // advance to node before target
    }

    if (curr.next && curr.next.value === value) {
      curr.next = curr.next.next; // skip the target node
    }
  }

  printList(): void {
    let curr = this.head;
    let result = '';
    while (curr) {
      result += curr.value + ' -> ';
      curr = curr.next;
    }
    result += 'null';
    console.log(result);
  }
}

// Driver code
const list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.append(4);
console.log('Original list:');
list.printList();

list.deleteByValue(3);
console.log('After deleting value 3:');
list.printList();
if (this.head.value === value) { this.head = this.head.next; // remove head return; }
Check if head node is the one to delete and remove it by moving head pointer
while (curr.next && curr.next.value !== value) { curr = curr.next; // advance to node before target }
Traverse list to find node before the one to delete
if (curr.next && curr.next.value === value) { curr.next = curr.next.next; // skip the target node }
Remove target node by skipping it in the chain
OutputSuccess
Original list: 1 -> 2 -> 3 -> 4 -> null After deleting value 3: 1 -> 2 -> 4 -> null
Complexity Analysis
Time: O(n) because in the worst case we traverse all nodes once to find the value
Space: O(1) because we only use a few pointers and no extra data structures
vs Alternative: Compared to rebuilding a new list without the value (which is O(n) time and space), this method modifies in place with constant space
Edge Cases
empty list
No deletion happens, function returns immediately
DSA Typescript
if (!this.head) return; // empty list
value is at head
Head pointer moves to next node, removing the first node
DSA Typescript
if (this.head.value === value) {
  this.head = this.head.next; // remove head
  return;
}
value not found
List remains unchanged after traversal
DSA Typescript
while (curr.next && curr.next.value !== value) {
  curr = curr.next; // advance to node before target
}
When to Use This Pattern
When you need to remove a specific value from a linked list, look for the 'Delete Node by Value' pattern because it requires careful pointer updates to keep the list connected.
Common Mistakes
Mistake: Not handling deletion of the head node separately
Fix: Add a check to update head pointer if the head node contains the target value
Mistake: Skipping the node incorrectly by not updating the previous node's next pointer
Fix: Ensure the previous node's next pointer is set to the node after the one being deleted
Summary
Deletes the first node with a given value from a singly linked list.
Use when you want to remove a specific value from a linked list efficiently.
The key is to find the node before the target and change its next pointer to skip the target node.

Practice

(1/5)
1. What is the main purpose of the Delete Node by Value operation in a linked list?
easy
A. Reverse the linked list
B. Add a new node with the given value at the end
C. Remove the first node that contains the given value
D. Find the position of a node with the given value

Solution

  1. Step 1: Understand the operation goal

    The operation aims to remove a node that matches a specific value from the linked list.
  2. Step 2: Identify the correct action

    Removing the first node with the given value means deleting that node and linking its previous node to the next node.
  3. Final Answer:

    Remove the first node that contains the given value -> Option C
  4. Quick Check:

    Delete node by value = Remove first matching node [OK]
Hint: Delete node by value means remove first matching node [OK]
Common Mistakes:
  • Confusing deletion with insertion
  • Trying to delete all nodes with the value instead of first
  • Thinking it finds position only
  • Assuming it reverses the list
2. Which of the following TypeScript code snippets correctly deletes the head node if its value is 5 from a singly linked list starting at head?
easy
A. if (head.value === 5) head = head.next;
B. head = head.next.value === 5 ? head.next.next : head;
C. while (head.value !== 5) head = head.next;
D. head.next = null;

Solution

  1. Step 1: Check if head node has value 5

    If the first node's value is 5, we remove it by moving head to the next node.
  2. Step 2: Verify code correctness

    if (head.value === 5) head = head.next; correctly updates head to head.next if head.value is 5, effectively deleting the first node.
  3. Final Answer:

    if (head.value === 5) head = head.next; -> Option A
  4. Quick Check:

    Delete head node by reassigning head [OK]
Hint: Check head value first, then update head pointer [OK]
Common Mistakes:
  • Using incorrect conditional expressions
  • Assigning head.next incorrectly
  • Not handling head node deletion
  • Overwriting head without checks
3. Given the linked list: 1 -> 3 -> 5 -> 7 -> null, what is the list after deleting the node with value 5 using the following TypeScript code?
let current = head;
while (current.next !== null) {
  if (current.next.value === 5) {
    current.next = current.next.next;
    break;
  }
  current = current.next;
}
medium
A. 1 -> 3 -> 5 -> 7 -> null
B. 1 -> 3 -> 7 -> null
C. 3 -> 5 -> 7 -> null
D. 1 -> 7 -> null

Solution

  1. Step 1: Traverse list to find node before value 5

    Loop checks nodes until current.next.value is 5, which is true when current is node with value 3.
  2. Step 2: Delete node with value 5 by skipping it

    Set current.next to current.next.next, linking node 3 directly to node 7, removing node 5.
  3. Final Answer:

    1 -> 3 -> 7 -> null -> Option B
  4. Quick Check:

    Skip node with value 5 = 1->3->7 [OK]
Hint: Skip node by linking previous to next [OK]
Common Mistakes:
  • Not breaking loop after deletion
  • Deleting wrong node
  • Not updating pointers correctly
  • Confusing current and current.next
4. Consider this buggy TypeScript code to delete a node by value from a singly linked list:
function deleteNode(head: Node | null, value: number): Node | null {
  let current = head;
  while (current !== null) {
    if (current.next?.value === value) {
      current.next = current.next.next;
    }
    current = current.next!;
  }
  return head;
}
What is the main problem with this code?
medium
A. It may cause a runtime error when current.next is null
B. It deletes all nodes with the value instead of the first
C. It does not handle deletion if head node has the value
D. It reverses the linked list accidentally

Solution

  1. Step 1: Analyze the loop termination

    The while (current !== null) continues to the last node where current.next is null. The if uses ?. safely, but then executes current = current.next!;, and ! non-null assertion on null causes runtime error.
  2. Step 2: Confirm the bug triggers always

    For any non-empty list, it crashes at the last node regardless of value, preventing correct execution.
  3. Final Answer:

    It may cause a runtime error when current.next is null -> Option A
  4. Quick Check:

    current.next! on null = runtime error [OK]
Hint: Beware of non-null assertion ! on potentially null next [OK]
Common Mistakes:
  • Using non-null assertion (!) on potentially null next
  • Assuming current.next always exists
  • Not breaking after deletion
  • Confusing current and current.next updates
5. You have a singly linked list: 2 -> 4 -> 6 -> 4 -> 8 -> null. You want to delete the first node with value 4. After deletion, you want to insert a new node with value 10 right after the deleted node's position. Which sequence of operations correctly achieves this?
hard
A. Delete first 4, then insert 10 after node 6
B. Insert 10 at head, then delete first 4
C. Delete all 4s, then insert 10 at end
D. Delete first 4, then insert 10 after node 2

Solution

  1. Step 1: Delete first node with value 4

    The first 4 is the second node, so remove it by linking node 2 to node 6.
  2. Step 2: Insert new node with value 10 after node 2

    Create new node 10 and link it after node 2, then link new node to node 6.
  3. Final Answer:

    Delete first 4, then insert 10 after node 2 -> Option D
  4. Quick Check:

    Delete 4, insert 10 after previous node [OK]
Hint: Delete node, then insert new node at same position [OK]
Common Mistakes:
  • Inserting new node at wrong position
  • Deleting all nodes with value 4
  • Not updating links correctly
  • Inserting before deletion
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard