Bird
Raised Fist0
DSA Typescriptprogramming

Insert at Middle Specific Position in DSA Typescript

Choose your learning style10 modes available
Mental Model
We add a new item inside a linked list at a certain spot by moving step-by-step to that spot and linking the new item there.
Analogy: Imagine a line of people holding hands. To add a new friend in the middle, you find the right spot, then everyone nearby holds hands with the new friend instead of directly with each other.
head -> 1 -> 2 -> 3 -> 4 -> null
           ↑
         position 2
Dry Run Walkthrough
Input: list: 1 -> 2 -> 4 -> 5, insert value 3 at position 3
Goal: Insert the value 3 between nodes 2 and 4, so the list becomes 1 -> 2 -> 3 -> 4 -> 5
Step 1: start at head node 1
head -> [curr->1] -> 2 -> 4 -> 5 -> null
Why: We begin from the start to find the correct position
Step 2: move curr to node 2 (position 2)
head -> 1 -> [curr->2] -> 4 -> 5 -> null
Why: We move forward to one before the insertion point
Step 3: create new node 3 and link it after curr
head -> 1 -> 2 -> [new->3] -> 4 -> 5 -> null
Why: Insert new node by adjusting pointers to include it in the list
Step 4: link node 3's next to node 4
head -> 1 -> 2 -> 3 -> 4 -> 5 -> null
Why: Complete insertion by connecting new node to the rest of the list
Result:
head -> 1 -> 2 -> 3 -> 4 -> 5 -> 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;
  }

  insertAtPosition(value: number, position: number): void {
    const newNode = new Node(value);
    if (position === 1) {
      newNode.next = this.head;
      this.head = newNode;
      return;
    }

    let curr = this.head;
    let count = 1;
    while (curr !== null && count < position - 1) {
      curr = curr.next;
      count++;
    }

    if (curr === null) {
      // position is beyond list length, ignore insertion
      return;
    }

    newNode.next = curr.next; // link new node to next node
    curr.next = newNode;      // link current node to new node
  }

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

// Driver code
const list = new LinkedList();
list.head = new Node(1);
list.head.next = new Node(2);
list.head.next.next = new Node(4);
list.head.next.next.next = new Node(5);

list.insertAtPosition(3, 3);
list.printList();
if (position === 1) { newNode.next = this.head; this.head = newNode; return; }
handle insertion at the start by updating head pointer
while (curr !== null && count < position - 1) { curr = curr.next; count++; }
move curr to node before insertion position
if (curr === null) { return; }
stop if position is beyond list length
newNode.next = curr.next; curr.next = newNode;
insert new node by linking pointers
OutputSuccess
1 -> 2 -> 3 -> 4 -> 5 -> null
Complexity Analysis
Time: O(n) because we may need to move through up to n nodes to reach the insertion point
Space: O(1) because we only create one new node and use a few pointers
vs Alternative: Compared to inserting at the start or end which can be O(1), inserting in the middle requires traversal making it O(n)
Edge Cases
inserting at position 1 (start)
new node becomes the new head
DSA Typescript
if (position === 1) { newNode.next = this.head; this.head = newNode; return; }
inserting at position beyond list length
insertion is ignored to avoid errors
DSA Typescript
if (curr === null) { return; }
empty list insertion at position 1
new node becomes the head of the empty list
DSA Typescript
if (position === 1) { newNode.next = this.head; this.head = newNode; return; }
When to Use This Pattern
When you need to add an item at a specific spot inside a linked list, use the insert at position pattern to carefully link the new node without breaking the list.
Common Mistakes
Mistake: Not moving to the node before the insertion position, causing pointer errors
Fix: Traverse until position - 1 to correctly link the new node
Mistake: Not handling insertion at position 1 separately, causing head pointer errors
Fix: Add a special case for position 1 to update the head pointer
Summary
Inserts a new node at a given position inside a linked list by adjusting pointers.
Use when you want to add an element anywhere except just the start or end of the list.
The key is to stop at the node before the insertion point and link the new node in between.

Practice

(1/5)
1. What does inserting at a specific middle position in a linked list mean?
easy
A. Adding a new node only at the beginning of the list
B. Removing a node from the middle of the list
C. Adding a new node only at the end of the list
D. Adding a new node exactly at the given position counting from the start

Solution

  1. Step 1: Understand insertion position

    Inserting at a specific middle position means placing the new node exactly at that position counting from the start of the list.
  2. Step 2: Differentiate from other insertions

    Insertion at beginning or end is different; here we insert inside the list at a given index.
  3. Final Answer:

    Adding a new node exactly at the given position counting from the start -> Option D
  4. Quick Check:

    Insert at position = Add node at that index [OK]
Hint: Insert means add node exactly at given index [OK]
Common Mistakes:
  • Confusing insertion with deletion
  • Thinking insertion only happens at start or end
  • Ignoring the position index
2. Which of the following TypeScript code snippets correctly inserts a node with value 10 at position 2 in a singly linked list?
easy
A. function insertAtPosition(head, val, pos) { let newNode = {value: val, next: null}; let current = head; for(let i=1; i
B. function insertAtPosition(head, val, pos) { let newNode = {value: val, next: null}; let current = head; for(let i=0; i
C. function insertAtPosition(head, val, pos) { let newNode = {value: val, next: null}; newNode.next = head; head = newNode; return head; }
D. function insertAtPosition(head, val, pos) { let newNode = {value: val, next: null}; head.next = newNode; return head; }

Solution

  1. Step 1: Analyze loop for position

    The loop runs from 1 to pos-2 to reach node before insertion point (pos-1).
  2. Step 2: Insert new node correctly

    New node's next points to current.next, then current.next updated to new node.
  3. Final Answer:

    Code in option A correctly inserts at position 2 -> Option A
  4. Quick Check:

    Loop to pos-1, link new node [OK]
Hint: Loop to node before position, then insert [OK]
Common Mistakes:
  • Looping too far or too short
  • Not updating newNode.next correctly
  • Inserting at wrong position index
3. What will be the linked list after inserting value 99 at position 3 in the list 1 -> 2 -> 3 -> 4 -> null using the following TypeScript code?
function insertAtPosition(head, val, pos) {
  let newNode = {value: val, next: null};
  if (pos === 1) {
    newNode.next = head;
    return newNode;
  }
  let current = head;
  for (let i = 1; i < pos - 1; i++) {
    current = current.next;
  }
  newNode.next = current.next;
  current.next = newNode;
  return head;
}

// Initial list: 1 -> 2 -> 3 -> 4 -> null
// Insert 99 at position 3
let head = {value:1, next:{value:2, next:{value:3, next:{value:4, next:null}}}};
head = insertAtPosition(head, 99, 3);
medium
A. 1 -> 2 -> 3 -> 4 -> 99 -> null
B. 1 -> 2 -> 99 -> 3 -> 4 -> null
C. 99 -> 1 -> 2 -> 3 -> 4 -> null
D. 1 -> 99 -> 2 -> 3 -> 4 -> null

Solution

  1. Step 1: Traverse to node before position 3

    Loop runs i=1 to pos-2=1, so current moves to node with value 2.
  2. Step 2: Insert new node after current

    New node 99 points to current.next (node 3), current.next updated to new node.
  3. Final Answer:

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

    Insert at pos 3 places 99 after 2 [OK]
Hint: Insert after node at pos-1 [OK]
Common Mistakes:
  • Inserting at wrong position
  • Not updating links correctly
  • Confusing position indexing
4. Identify the error in the following TypeScript function that tries to insert a node at position 2 in a linked list.
function insertAtPosition(head, val, pos) {
  let newNode = {value: val, next: null};
  let current = head;
  for(let i = 0; i < pos - 1; i++) {
    current = current.next;
  }
  newNode.next = current.next;
  current.next = newNode;
  return head;
}
medium
A. The loop runs one step too many, causing current to be null before insertion
B. The newNode.next is not assigned correctly
C. The function does not handle insertion at position 1
D. The function returns newNode instead of head

Solution

  1. Step 1: Analyze loop range

    The loop runs from i=0 to pos-2, moving current pos-1 times, which moves current too far.
  2. Step 2: Consequence of loop

    Current becomes the node at position pos, so current.next is undefined, causing error on insertion.
  3. Final Answer:

    The loop runs one step too many, causing current to be null before insertion -> Option A
  4. Quick Check:

    Loop overshoot breaks insertion [OK]
Hint: Loop to node before position, not at position [OK]
Common Mistakes:
  • Looping to position instead of position-1
  • Not checking for position 1 insertion
  • Incorrectly updating links
5. Given a singly linked list and a position that may be greater than the list length, how should you modify the insertAtPosition function to insert the new node at the end if the position is beyond the list length? Choose the correct approach.
hard
A. Insert the new node at the head regardless of position
B. Throw an error if position is greater than list length
C. Traverse until current.next is null or position reached, then insert new node at current.next
D. Ignore the insertion if position is invalid

Solution

  1. Step 1: Traverse safely

    Move current node forward until either position-1 steps or current.next is null (end of list).
  2. Step 2: Insert at end if position too large

    If position is beyond length, current.next will be null, so insert new node at end by setting current.next to new node.
  3. Final Answer:

    Traverse until current.next is null or position reached, then insert new node at current.next -> Option C
  4. Quick Check:

    Insert at end if position too large [OK]
Hint: Stop at end or position, then insert [OK]
Common Mistakes:
  • Not handling position beyond length
  • Throwing error unnecessarily
  • Inserting at wrong place when position invalid
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