📖 Scenario: You are building a simple contact list app. Each contact will be stored in a doubly linked list node so you can easily move forward and backward through the contacts.
🎯 Goal: Create a doubly linked list with three contacts: Alice, Bob, and Charlie. Initialize the list so each node points to the next and previous contacts correctly.
📋 What You'll Learn
Create a Node class with data, next, and prev properties
Create three nodes with data: 'Alice', 'Bob', and 'Charlie'
Link the nodes so Alice points to Bob, Bob points to Charlie, and the prev pointers go backward
Create a variable head that points to the first node (Alice)
💡 Why This Matters
🌍 Real World
Doubly linked lists are used in music players to move forward and backward through songs, or in browsers to navigate back and forth through pages.
💼 Career
Understanding linked lists helps in jobs involving data structure design, memory management, and building efficient navigation systems.
Progress0 / 4 steps
1
Create the Node class
Create a Node class with a constructor that takes a data string and initializes next and prev to null.
DSA Typescript
Hint
Use class keyword and define data, next, and prev properties. Initialize next and prev to null in the constructor.
2
Create three nodes for contacts
Create three variables node1, node2, and node3 as new Node instances with data 'Alice', 'Bob', and 'Charlie' respectively.
DSA Typescript
Hint
Create variables using const and call new Node('Name') for each contact.
3
Link the nodes to form the doubly linked list
Link the nodes so node1.next is node2, node2.prev is node1, node2.next is node3, and node3.prev is node2.
DSA Typescript
Hint
Assign next and prev properties to connect nodes forward and backward.
4
Create head pointer and print the list forward
Create a variable head that points to node1. Then use a while loop to print each node's data starting from head moving forward using next. Print the data separated by -> and end with null.
DSA Typescript
Hint
Use a while loop starting from head. Append each data to a string with -> . After the loop, add null and print the string.
Practice
(1/5)
1. What is the main difference between a doubly linked list and a singly linked list?
easy
A. A doubly linked list stores data in arrays instead of nodes.
B. A doubly linked list does not use pointers at all.
C. A doubly linked list can only be traversed forward.
D. A doubly linked list has nodes with pointers to both previous and next nodes.
Solution
Step 1: Understand node structure in doubly linked list
Each node in a doubly linked list contains data and two pointers: one to the previous node and one to the next node.
Step 2: Compare with singly linked list
A singly linked list node has only one pointer to the next node, so it can only be traversed forward.
Final Answer:
A doubly linked list has nodes with pointers to both previous and next nodes. -> Option D
Quick Check:
Doubly linked list = two pointers per node [OK]
Hint: Remember: doubly means two pointers per node [OK]
Common Mistakes:
Thinking doubly linked list uses arrays
Assuming it can only go forward
Confusing pointer usage
2. Which of the following TypeScript code snippets correctly defines a node class for a doubly linked list?
easy
A. class Node { data: number; next: Node; constructor(data: number) { this.data = data; this.next = null; } }
class Node { data: number; next: Node | null; prev: Node | null; constructor(data: number) { this.data = data; this.next = null; this.prev = null; } } defines both next and prev as Node or null, which is correct for doubly linked list nodes.
Step 2: Verify constructor initialization
class Node { data: number; next: Node | null; prev: Node | null; constructor(data: number) { this.data = data; this.next = null; this.prev = null; } } initializes next and prev to null, which is proper for a new node.
Hint: Look for both next and prev properties initialized to null [OK]
Common Mistakes:
Missing prev pointer in node class
Using wrong types for pointers
Initializing pointers with numbers instead of null
3. What will be the output of the following TypeScript code that creates a doubly linked list with nodes 10, 20, 30 and prints the list forward?
class Node {
data: number;
next: Node | null;
prev: Node | null;
constructor(data: number) {
this.data = data;
this.next = null;
this.prev = null;
}
}
class DoublyLinkedList {
head: Node | null = null;
append(data: number) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
return;
}
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
newNode.prev = current;
}
printForward() {
let current = this.head;
let result = '';
while (current) {
result += current.data + ' -> ';
current = current.next;
}
result += 'null';
console.log(result);
}
}
const list = new DoublyLinkedList();
list.append(10);
list.append(20);
list.append(30);
list.printForward();
medium
A. 10 -> 20 -> 30 -> null
B. 30 -> 20 -> 10 -> null
C. null -> 10 -> 20 -> 30
D. 10 -> 20 -> null
Solution
Step 1: Append nodes 10, 20, 30 in order
Nodes are added at the end, so list order is 10, then 20, then 30.
Step 2: Print list forward
printForward traverses from head to next nodes, printing data with arrows, ending with null.
Final Answer:
10 -> 20 -> 30 -> null -> Option A
Quick Check:
Appending adds to tail, printForward shows 10 to 30 [OK]
Hint: Appending adds nodes at tail; printForward shows head to tail [OK]
Common Mistakes:
Confusing print order as reversed
Missing last node in output
Printing null at start instead of end
4. Identify the error in the following TypeScript code that tries to append a node to a doubly linked list:
class Node {
data: number;
next: Node | null;
prev: Node | null;
constructor(data: number) {
this.data = data;
this.next = null;
this.prev = null;
}
}
class DoublyLinkedList {
head: Node | null = null;
append(data: number) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
return;
}
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
// Missing line here
}
}
medium
A. The code misses setting newNode.prev to current before appending.
B. The code should set head to newNode even if head exists.
C. The constructor should initialize next and prev to undefined, not null.
D. The while loop should check current.prev instead of current.next.
Solution
Step 1: Check append logic for doubly linked list
When appending, newNode.prev must point to current (the last node) to maintain backward link.
Step 2: Identify missing pointer assignment
The code sets current.next = newNode but does not set newNode.prev = current, breaking backward link.
Final Answer:
The code misses setting newNode.prev to current before appending. -> Option A
Quick Check:
newNode.prev must link to previous node [OK]
Hint: Always set newNode.prev = last node when appending [OK]
Common Mistakes:
Forgetting to set newNode.prev
Changing head incorrectly
Checking wrong pointer in loop
5. You want to create a doubly linked list from an array of numbers [5, 15, 25] and then reverse the list by changing pointers (not data). Which sequence of pointer changes correctly reverses the list?
hard
A. For each node, set next to prev and leave prev unchanged; head remains same.
B. For each node, set next to null and prev to null; then append nodes in reverse order.
C. For each node, swap its next and prev pointers; then update head to last node.
D. For each node, swap data values instead of pointers; head stays unchanged.
Solution
Step 1: Understand reversing a doubly linked list by pointers
Reversing means for each node, next and prev pointers must be swapped to reverse direction.
Step 2: Update head pointer
After swapping pointers, head must point to the original tail (last node) to reflect new start.
Final Answer:
For each node, swap its next and prev pointers; then update head to last node. -> Option C
Quick Check:
Swap next and prev, then reset head [OK]
Hint: Swap next and prev pointers on all nodes, then reset head [OK]
Common Mistakes:
Only swapping data, not pointers
Not updating head after reversal
Setting pointers to null incorrectly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.