Linked List vs Array When to Choose Which in DSA Typescript - Complexity Comparison
We want to understand how fast operations happen in arrays and linked lists.
This helps us decide which one to use for different tasks.
Analyze the time complexity of accessing and inserting elements in arrays and linked lists.
// Access element at index i in array
const element = array[i];
// Insert element at start of linked list
const newNode = { value: x, next: head };
head = newNode;
This code shows accessing an element in an array and inserting at the start of a linked list.
Look at what repeats when we do these operations many times.
- Primary operation: Access by index in array, and traversal in linked list for access.
- How many times: Access in array is direct (once), linked list access requires walking nodes one by one.
As the list or array grows, accessing elements behaves differently.
| Input Size (n) | Array Access Steps | Linked List Access Steps |
|---|---|---|
| 10 | 1 | Up to 10 |
| 100 | 1 | Up to 100 |
| 1000 | 1 | Up to 1000 |
Access in array stays fast no matter size; linked list access grows linearly with size.
Time Complexity: O(1) for array access, O(n) for linked list access
This means arrays let you get items instantly, but linked lists take longer as they grow.
[X] Wrong: "Linked lists are always slower than arrays for all operations."
[OK] Correct: Linked lists are faster for adding or removing items at the start because they don't need to shift elements like arrays do.
Knowing when to use arrays or linked lists shows you understand how data structures affect speed.
"What if we needed to insert elements only at the end of the list? How would the time complexity change for arrays and linked lists?"
Practice
Solution
Step 1: Understand random access in arrays
Arrays store elements in contiguous memory, so accessing by index is fast and direct.Step 2: Understand random access in linked lists
Linked lists require traversal from the head to reach an index, which is slower.Final Answer:
Array -> Option CQuick Check:
Fast random access = Array [OK]
- Thinking linked lists allow fast index access
- Confusing stack or queue with arrays
- Assuming all data structures have same access speed
Solution
Step 1: Understand TypeScript class instantiation
To create an instance, use the 'new' keyword with constructor parameters.Step 2: Check constructor parameters
LinkedListNode usually requires a value; null can represent empty data.Final Answer:
const node = new LinkedListNode(null); -> Option AQuick Check:
Use 'new' with constructor args for instances [OK]
- Omitting 'new' keyword
- Calling class like a function without 'new'
- Passing no arguments when constructor expects one
class Node {
value: number;
next: Node | null;
constructor(value: number) {
this.value = value;
this.next = null;
}
}
const head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
let current = head;
const result: number[] = [];
while (current !== null) {
result.push(current.value);
current = current.next;
}
console.log(result);Solution
Step 1: Build the linked list nodes
Nodes created with values 1, 2, 3 linked in order: 1 -> 2 -> 3 -> null.Step 2: Traverse and collect values
Loop pushes values 1, then 2, then 3 into result array.Final Answer:
[1, 2, 3] -> Option AQuick Check:
Traverse linked list in order = [1, 2, 3] [OK]
- Confusing order of nodes
- Not updating current pointer correctly
- Expecting reversed output
class Node {
value: number;
next: Node | null;
constructor(value: number) {
this.value = value;
this.next = null;
}
}
let head = new Node(1);
head.next = new Node(2);
function insertAtStart(newValue: number) {
const newNode = new Node(newValue);
newNode.next = head.next;
head = newNode;
}
insertAtStart(0);
let current = head;
const result: number[] = [];
while (current !== null) {
result.push(current.value);
current = current.next;
}
console.log(result);Solution
Step 1: Analyze insertion logic
New node's next is set to head.next, skipping the current head node.Step 2: Correct pointer assignment
To insert at start, newNode.next must point to current head, preserving the list.Final Answer:
newNode.next should point to head, not head.next -> Option BQuick Check:
Insert at start = newNode.next = head [OK]
- Setting newNode.next to head.next causes node loss
- Not updating head reference properly
- Confusing next pointers in linked list
Solution
Step 1: Consider insertion and deletion in arrays
Arrays require shifting elements when inserting or deleting in the middle, which is slow.Step 2: Consider linked list advantages
Linked lists can insert or delete nodes by changing pointers without shifting elements, making these operations faster.Final Answer:
Linked List, because it allows fast insertion and deletion without shifting elements. -> Option DQuick Check:
Frequent middle insert/delete = Linked List [OK]
- Choosing array for frequent middle insert/delete
- Thinking linked lists support binary search efficiently
- Ignoring cost of shifting elements in arrays
Ready to prove it?
Pass the test and this pattern moves unknown
