Bird
Raised Fist0
DSA Typescriptprogramming

Creating a Singly Linked List from Scratch in DSA Typescript - Step-by-Step

Choose your learning style10 modes available
Mental Model
A singly linked list is a chain of boxes where each box holds a value and points to the next box in line.
Analogy: Imagine a treasure hunt where each clue (box) tells you where to find the next clue, forming a chain you follow step by step.
head -> [value | next] -> [value | next] -> [value | next] -> null
Dry Run Walkthrough
Input: Create a list with values 1, then 2, then 3 added at the end
Goal: Build a linked list that holds 1 -> 2 -> 3 in order
Step 1: Create first node with value 1 and set head to it
head -> [1 | null]
Why: We start the list by creating the first box and pointing head to it
Step 2: Create second node with value 2 and link it after first node
head -> [1 | ->] -> [2 | null]
Why: We add a new box after the first to extend the chain
Step 3: Create third node with value 3 and link it after second node
head -> [1 | ->] -> [2 | ->] -> [3 | null]
Why: We add another box at the end to continue the chain
Result:
head -> [1 | ->] -> [2 | ->] -> [3 | null]
Annotated Code
DSA Typescript
class Node {
  value: number;
  next: Node | null;

  constructor(value: number) {
    this.value = value;
    this.next = null;
  }
}

class SinglyLinkedList {
  head: Node | null;

  constructor() {
    this.head = null;
  }

  append(value: number): void {
    const newNode = new Node(value);
    if (this.head === null) {
      this.head = newNode; // set head if list empty
      return;
    }
    let current = this.head;
    while (current.next !== null) {
      current = current.next; // move to last node
    }
    current.next = newNode; // link new node at end
  }

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

// Driver code
const list = new SinglyLinkedList();
list.append(1);
list.append(2);
list.append(3);
list.printList();
if (this.head === null) { this.head = newNode; // set head if list empty return; }
handle empty list by setting head to new node
while (current.next !== null) { current = current.next; // move to last node }
traverse list to find last node
current.next = newNode; // link new node at end
attach new node at the end of the list
OutputSuccess
1 -> 2 -> 3 -> null
Complexity Analysis
Time: O(n) because to add a node at the end, we traverse all n nodes once
Space: O(n) because each new node uses extra space proportional to the number of elements
vs Alternative: Compared to arrays, linked lists avoid shifting elements when adding at the end but require traversal to find the end
Edge Cases
Empty list when appending first node
Head is set to the new node directly
DSA Typescript
if (this.head === null) {
      this.head = newNode; // set head if list empty
      return;
    }
When to Use This Pattern
When you need a flexible list that grows by linking nodes one after another, use singly linked list creation to build it step by step.
Common Mistakes
Mistake: Not updating the head when the list is empty
Fix: Check if head is null and set it to the new node before traversing
Mistake: Forgetting to set newNode.next to null explicitly
Fix: Initialize newNode.next to null in the Node constructor
Summary
Creates a chain of nodes where each node points to the next, forming a singly linked list.
Use when you want a list structure that can grow dynamically without shifting elements.
Remember the first node is special and sets the head; all others link after the last node.

Practice

(1/5)
1. What is the main purpose of a Singly Linked List in data structures?
easy
A. To store elements in a sequence where each element points to the next one
B. To store elements with keys and values for fast lookup
C. To store elements in a sorted array for quick access
D. To store elements in a tree-like hierarchy

Solution

  1. Step 1: Understand the structure of a singly linked list

    A singly linked list stores elements in nodes where each node points to the next node in the sequence.
  2. Step 2: Compare with other data structures

    Unlike key-value stores or trees, singly linked lists maintain a simple linear chain of elements.
  3. Final Answer:

    To store elements in a sequence where each element points to the next one -> Option A
  4. Quick Check:

    Singly Linked List = sequence with next pointers [OK]
Hint: Remember: singly linked list nodes point only forward [OK]
Common Mistakes:
  • Confusing linked lists with arrays
  • Thinking linked lists store key-value pairs
  • Assuming linked lists are hierarchical like trees
2. Which of the following is the correct TypeScript syntax to define a node class for a singly linked list?
easy
A. class Node { value: number; next: Node | null; constructor(value: number) { this.value = value; this.next = null; } }
B. class Node { value: number; next: Node; constructor(value: number) { this.value = value; this.next = null; } }
C. class Node { value: number; next: null; constructor(value: number) { this.value = value; this.next = null; } }
D. class Node { value: number; next: any; constructor(value: number) { this.value = value; this.next = undefined; } }

Solution

  1. Step 1: Check the type of the next pointer

    The next pointer should be either another Node or null if it is the last node.
  2. Step 2: Verify constructor initialization

    The constructor sets the value and initializes next to null, which is correct for a new node.
  3. Final Answer:

    class Node { value: number; next: Node | null; constructor(value: number) { this.value = value; this.next = null; } } -> Option A
  4. Quick Check:

    next can be Node or null = class Node { value: number; next: Node | null; constructor(value: number) { this.value = value; this.next = null; } } [OK]
Hint: Use union type for next: Node | null [OK]
Common Mistakes:
  • Forgetting to allow next to be null
  • Setting next to undefined instead of null
  • Using any type for next which loses type safety
3. What will be the output after running this TypeScript code that creates a singly linked list with values 10, 20, 30 and prints it?
class Node {
  value: number;
  next: Node | null;
  constructor(value: number) {
    this.value = value;
    this.next = null;
  }
}

class LinkedList {
  head: Node | null = null;

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

  print() {
    let current = this.head;
    let result = '';
    while (current) {
      result += current.value + ' -> ';
      current = current.next;
    }
    result += 'null';
    console.log(result);
  }
}

const list = new LinkedList();
list.append(10);
list.append(20);
list.append(30);
list.print();
medium
A. 30 -> 20 -> 10 -> null
B. null
C. 10 -> 20 -> null
D. 10 -> 20 -> 30 -> null

Solution

  1. Step 1: Append nodes in order

    Nodes with values 10, 20, and 30 are appended in that order, so the list is 10 -> 20 -> 30.
  2. Step 2: Print the list

    The print method traverses from head to end, concatenating values with ' -> ' and ending with 'null'.
  3. Final Answer:

    10 -> 20 -> 30 -> null -> Option D
  4. Quick Check:

    Appending preserves order = 10 -> 20 -> 30 -> null [OK]
Hint: Append adds at end; print shows sequence [OK]
Common Mistakes:
  • Assuming append adds at head instead of tail
  • Forgetting to add 'null' at the end
  • Printing values in reverse order
4. Identify the error in this TypeScript code snippet that tries to append a node to a singly linked list:
class Node {
  value: number;
  next: Node | null;
  constructor(value: number) {
    this.value = value;
    this.next = null;
  }
}

class LinkedList {
  head: Node | null = null;

  append(value: number) {
    const newNode = new Node(value);
    if (this.head === null) {
      this.head = newNode;
    } else {
      let current = this.head;
      while (current.next !== null) {
        current = current.next;
      }
      current.next = newNode;
    }
  }
}

const list = new LinkedList();
list.append(5);
list.append(10);
console.log(list.head.next.value);
medium
A. Error: head is undefined
B. Error: Cannot read property 'value' of null
C. No error; output will be 10
D. Error: next property is missing in Node

Solution

  1. Step 1: Check append logic

    The append method correctly adds the first node as head and subsequent nodes at the end.
  2. Step 2: Verify output of console.log

    After appending 5 and 10, head.next points to the node with value 10, so accessing value is valid.
  3. Final Answer:

    No error; output will be 10 -> Option C
  4. Quick Check:

    Proper append and access = 10 [OK]
Hint: Check if head and next are properly assigned before access [OK]
Common Mistakes:
  • Forgetting to return after setting head in append
  • Accessing next.value when next is null
  • Not initializing next to null in Node
5. You want to create a method reverse() in your singly linked list class that reverses the list in place. Which approach correctly reverses the links between nodes?
hard
A. Create a new list and append nodes from the original list in reverse order
B. Iterate through the list, for each node set its next to the previous node, updating previous and current pointers
C. Swap the values of the first and last nodes repeatedly until the middle is reached
D. Remove all nodes and re-insert them at the head one by one

Solution

  1. Step 1: Understand in-place reversal

    Reversing links means changing each node's next pointer to point to the previous node, not creating new nodes.
  2. Step 2: Identify correct method

    Iterating with previous and current pointers and updating next links reverses the list efficiently in place.
  3. Final Answer:

    Iterate through the list, for each node set its next to the previous node, updating previous and current pointers -> Option B
  4. Quick Check:

    In-place reversal = update next pointers backward [OK]
Hint: Reverse by redirecting next pointers, not swapping values [OK]
Common Mistakes:
  • Swapping node values instead of links
  • Creating a new list instead of reversing in place
  • Removing and re-adding nodes unnecessarily
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