📖 Scenario: You are building a simple contact list app. Each contact is stored as a node in a doubly linked list. You want to add new contacts to the beginning of the list so they appear first.
🎯 Goal: Build a doubly linked list and write code to insert a new node at the beginning. Then print the list from head to tail to see the order of contacts.
📋 What You'll Learn
Create a Node struct with data, prev, and next members
Create a head pointer to track the start of the list
Write a function insertAtBeginning to add a new node at the start
Print the list from head to tail showing each node's data
💡 Why This Matters
🌍 Real World
Doubly linked lists are used in music players to move forward and backward between songs, in browsers to navigate back and forth between pages, and in many applications where you need quick insertions and deletions from both ends.
💼 Career
Understanding linked lists is fundamental for software developers, especially for roles involving system programming, game development, and building efficient data structures.
Progress0 / 4 steps
1
Create Node struct and initialize head
Create a struct Node with an int data, and two pointers Node* prev and Node* next. Then create a Node* head and set it to nullptr.
DSA C++
Hint
Think of each node as a box holding a number and two arrows: one to the previous box and one to the next box.
2
Create a function to insert at beginning
Write a function void insertAtBeginning(int value) that creates a new Node with data = value, sets its prev to nullptr, and inserts it at the start of the list pointed by head. Update head to this new node.
DSA C++
Hint
Remember to update the previous head's prev pointer to the new node if the list is not empty.
3
Insert multiple nodes at beginning
Use the function insertAtBeginning to insert the values 10, 20, and 30 in that order.
DSA C++
Hint
Call the function three times with the exact values given.
4
Print the doubly linked list from head to tail
Write a while loop to print the data of each node starting from head until the end of the list. Print each value followed by -> and end with null.
DSA C++
Hint
Use a while loop to move from one node to the next until you reach the end (nullptr).
Practice
(1/5)
1. What is the main purpose of inserting a node at the beginning of a doubly linked list?
easy
A. To delete the first node of the list
B. To add a new node before the current head node
C. To add a new node after the tail node
D. To reverse the entire list
Solution
Step 1: Understand the head node position
The head node is the first node in the doubly linked list.
Step 2: Insert new node before head
Inserting at the beginning means placing the new node before the current head and updating pointers.
Final Answer:
To add a new node before the current head node -> Option B
Quick Check:
Insert at beginning = Add before head [OK]
Hint: Insert at beginning means new node becomes the head [OK]
Common Mistakes:
Confusing insertion at beginning with insertion at end
Not updating the previous head's previous pointer
Trying to delete instead of insert
2. Which of the following is the correct syntax to create a new node and insert it at the beginning of a doubly linked list in C++?
easy
A. Node* newNode = new Node(data); head->prev = newNode; newNode->next = head; head = newNode;
B. Node newNode = Node(data); newNode->next = head; head = newNode;
C. Node* newNode = new Node(data); head->next = newNode; newNode->prev = head; head = newNode;
D. Node* newNode = new Node(data); newNode->next = head; head = newNode;
Solution
Step 1: Create new node with pointer
Use pointer syntax: Node* newNode = new Node(data);
Step 2: Update pointers for doubly linked list
Set newNode->next to current head, update head->prev to newNode, then update head to newNode.
Final Answer:
Node* newNode = new Node(data); head->prev = newNode; newNode->next = head; head = newNode; -> Option A
Quick Check:
Correct pointer updates = Node* newNode = new Node(data); head->prev = newNode; newNode->next = head; head = newNode; [OK]
Hint: Remember to update both next and prev pointers [OK]
Common Mistakes:
Using object instead of pointer for new node
Not updating head->prev pointer
Swapping next and prev pointers incorrectly
3. What will be the output of the following code snippet after inserting 10 at the beginning of the doubly linked list?
struct Node {
int data;
Node* prev;
Node* next;
Node(int d) : data(d), prev(nullptr), next(nullptr) {}
};
Node* head = new Node(20);
head->next = new Node(30);
head->next->prev = head;
Node* newNode = new Node(10);
newNode->next = head;
head->prev = newNode;
head = newNode;
// Print list from head
Node* temp = head;
while(temp) {
std::cout << temp->data << " -> ";
temp = temp->next;
}
std::cout << "null";
medium
A. 30 -> 20 -> 10 -> null
B. 20 -> 30 -> 10 -> null
C. 10 -> 20 -> 30 -> null
D. 10 -> 30 -> 20 -> null
Solution
Step 1: Initial list setup
List initially: 20 <-> 30, head points to 20.
Step 2: Insert 10 at beginning
New node 10 points next to 20, 20's prev points to 10, head updated to 10.
Step 3: Print list from head
Traverse from head: 10 -> 20 -> 30 -> null
Final Answer:
10 -> 20 -> 30 -> null -> Option C
Quick Check:
New head is 10, followed by 20 and 30 [OK]
Hint: New node becomes head, old head shifts right [OK]
Common Mistakes:
Not updating head pointer after insertion
Incorrect pointer assignments causing wrong order
Printing from tail instead of head
4. Identify the error in the following code snippet that inserts a node at the beginning of a doubly linked list:
void insertAtBeginning(Node*& head, int data) {
Node* newNode = new Node(data);
newNode->next = head;
head->prev = newNode;
head = newNode;
}
medium
A. newNode->prev should be set to head
B. newNode->next should be set to nullptr
C. head pointer should not be passed by reference
D. Missing check if head is nullptr before accessing head->prev
Solution
Step 1: Analyze pointer usage
Code accesses head->prev without checking if head is nullptr (empty list).
Step 2: Identify potential runtime error
If head is nullptr, accessing head->prev causes a crash (null pointer dereference).
Final Answer:
Missing check if head is nullptr before accessing head->prev -> Option D
Quick Check:
Always check head != nullptr before head->prev [OK]
Hint: Check if list is empty before updating pointers [OK]
Common Mistakes:
Ignoring nullptr checks causing crashes
Incorrect pointer assignments for prev
Passing head by value instead of reference
5. Given a doubly linked list with nodes containing values [5, 15, 25], write the sequence of node values after inserting 1 at the beginning and then 35 at the beginning. What is the final list?
hard
A. 35 -> 1 -> 5 -> 15 -> 25 -> null
B. 1 -> 35 -> 5 -> 15 -> 25 -> null
C. 5 -> 15 -> 25 -> 1 -> 35 -> null
D. 35 -> 5 -> 15 -> 25 -> 1 -> null
Solution
Step 1: Initial list
List is 5 -> 15 -> 25 -> null.
Step 2: Insert 1 at beginning
New head is 1, list becomes 1 -> 5 -> 15 -> 25 -> null.
Step 3: Insert 35 at beginning
New head is 35, list becomes 35 -> 1 -> 5 -> 15 -> 25 -> null.
Final Answer:
35 -> 1 -> 5 -> 15 -> 25 -> null -> Option A
Quick Check:
Last inserted node is new head [OK]
Hint: Last inserted node at beginning becomes new head [OK]
Common Mistakes:
Inserting nodes at end instead of beginning
Not updating head pointer after each insertion
Mixing order of inserted nodes
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.