What if you could add items to the end of a list instantly, no matter how long it is?
Why Insert at End of Doubly Linked List in DSA Typescript?
Imagine you have a long chain of paper clips linked together. You want to add a new paper clip at the very end of the chain. Doing this by hand means you have to find the last clip first, which can take a lot of time if the chain is very long.
Manually finding the last paper clip means checking each clip one by one until you reach the end. This is slow and tiring. If you lose track or miss a clip, you might add the new clip in the wrong place, causing the chain to break or get messy.
Using a doubly linked list with an insert-at-end operation lets you add a new item directly at the end without checking every item. It keeps track of the last item, so you can quickly attach the new one, keeping the chain neat and organized.
let current = head;
while (current.next !== null) {
current = current.next;
}
current.next = newNode;
newNode.prev = current;
newNode.next = null;if (tail === null) { head = newNode; tail = newNode; } else { tail.next = newNode; newNode.prev = tail; tail = newNode; }
This operation makes it easy and fast to grow your list from the end, enabling efficient management of sequences like playlists, undo histories, or navigation paths.
Think of a music playlist app where you add songs to the end of your current list. Using this method, the app quickly adds new songs without searching through the entire playlist.
Manually adding at the end is slow and error-prone.
Insert at end in doubly linked list is fast and direct.
Keeps data organized and easy to manage.
Practice
Solution
Step 1: Understand the structure of a doubly linked list
A doubly linked list has nodes connected forward and backward, allowing traversal in both directions.Step 2: Purpose of insertion at the end
Inserting at the end means adding a new node after the current last node, updating pointers accordingly.Final Answer:
To add a new element after the last node -> Option AQuick Check:
Insert at end = add after last node [OK]
- Confusing insertion at end with deletion
- Thinking insertion reverses the list
- Assuming insertion happens at the start
Solution
Step 1: Identify required properties for a doubly linked list node
A node must have data, next pointer, and prev pointer to link both directions.Step 2: Check each option for correct properties
const newNode = { data: 5, next: null, prev: null }; has data, next, and prev all properly set. Others miss prev or use wrong property names.Final Answer:
const newNode = { data: 5, next: null, prev: null }; -> Option BQuick Check:
Node needs data, next, prev [OK]
- Omitting prev pointer
- Using wrong property names like value or nextNode
- Setting next or prev as undefined instead of null
class Node {
data: number;
next: Node | null = null;
prev: Node | null = null;
constructor(data: number) { this.data = data; }
}
class DoublyLinkedList {
head: Node | null = null;
insertAtEnd(data: number) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
return;
}
let temp = this.head;
while (temp.next) {
temp = temp.next;
}
temp.next = newNode;
newNode.prev = temp;
}
printList() {
let temp = this.head;
let result = '';
while (temp) {
result += temp.data + ' -> ';
temp = temp.next;
}
result += 'null';
console.log(result);
}
}
const dll = new DoublyLinkedList();
dll.insertAtEnd(10);
dll.insertAtEnd(20);
dll.insertAtEnd(30);
dll.printList();Solution
Step 1: Trace insertAtEnd calls
First insert adds 10 as head. Second adds 20 after 10. Third adds 30 after 20.Step 2: Trace printList output
Print starts at head (10), then 20, then 30, then null.Final Answer:
10 -> 20 -> 30 -> null -> Option AQuick Check:
Inserted nodes in order = 10 -> 20 -> 30 [OK]
- Confusing order and printing reversed list
- Missing last inserted node
- Printing null instead of list
insertAtEnd(data: number) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
}
let temp = this.head;
while (temp.next) {
temp = temp.next;
}
temp.next = newNode;
newNode.prev = temp;
}Solution
Step 1: Analyze empty list case
If head is null, method sets head to newNode but continues to loop and assign next, causing error.Step 2: Fix by adding return after setting head
Adding return after setting head prevents further code execution and avoids null pointer errors.Final Answer:
Missing return after setting head when list is empty -> Option DQuick Check:
Return after head set avoids errors [OK]
- Not returning after setting head
- Misunderstanding loop condition
- Incorrect pointer assignments
Solution
Step 1: Understand insertion at end
The new node 40 should be linked after 30, so 30.next = 40 and 40.prev = 30.Step 2: Confirm pointers of new node
Since 40 is last, 40.next must be null to mark list end.Final Answer:
10 <-> 20 <-> 30 <-> 40, where 40.prev points to 30 and 40.next is null -> Option CQuick Check:
New tail prev = old tail, next = null [OK]
- Setting new node's next pointer incorrectly
- Not linking new node's prev pointer
- Inserting new node at start instead of end
Ready to prove it?
Pass the test and this pattern moves unknown
