📖 Scenario: You are managing a playlist of songs where each song knows the previous and next song. You want to add a new song at the start of the playlist.
🎯 Goal: Build a doubly linked list and insert a new node at the beginning, then print the list from start to end.
📋 What You'll Learn
Create a Node class with data, prev, and next attributes
Create a DoublyLinkedList class with a head attribute
Implement a method insert_at_beginning(data) to add a node at the start
Implement a method print_list() to print the list from head to end
💡 Why This Matters
🌍 Real World
Doubly linked lists are used in music players, browsers, and undo-redo systems where you need to move forward and backward easily.
💼 Career
Understanding linked lists is fundamental for software engineering roles, especially for working with complex data structures and memory management.
Progress0 / 4 steps
1
Create Node and DoublyLinkedList classes
Create a Node class with an __init__ method that sets data, prev, and next attributes. Then create a DoublyLinkedList class with an __init__ method that sets head to None.
DSA Python
Hint
Define two classes. The Node holds data and links. The DoublyLinkedList starts empty with head = None.
2
Add insert_at_beginning method
Inside the DoublyLinkedList class, add a method called insert_at_beginning(self, data). This method should create a new Node with the given data. If the list is empty (head is None), set head to the new node. Otherwise, set the new node's next to the current head, set the current head's prev to the new node, and update head to the new node.
DSA Python
Hint
Create a new node. If list empty, set head to new node. Else, link new node before current head and update head.
3
Add print_list method
Inside the DoublyLinkedList class, add a method called print_list(self). This method should start from head and print each node's data followed by -> until the end of the list is reached. After the last node, print None.
DSA Python
Hint
Start from head and move next until None, printing each data with arrows.
4
Insert nodes and print the list
Create a DoublyLinkedList object called dll. Use insert_at_beginning to add nodes with data 10, 20, and 30 in that order. Then call dll.print_list() to display the list.
DSA Python
Hint
Create the list object, insert 10, then 20, then 30 at beginning, then print.
Practice
(1/5)
1. What is the main purpose of inserting a node at the beginning of a doubly linked list?
easy
A. To add a new node as the first element of the list
B. To remove the last node from the list
C. To reverse the entire list
D. To find the middle node of the list
Solution
Step 1: Understand the operation
Inserting at the beginning means adding a new node before the current first node.
Step 2: Identify the purpose
This operation makes the new node the first element in the doubly linked list.
Final Answer:
To add a new node as the first element of the list -> Option A
Quick Check:
Insert at beginning = Add new first node [OK]
Hint: Insert at beginning means new node becomes the first [OK]
Common Mistakes:
Confusing insertion at beginning with deletion
Thinking it reverses the list
Assuming it finds a node instead of adding
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 Python?
easy
A. new_node = Node(data); new_node.prev = head; head.next = new_node; head = new_node
B. new_node = Node(data); head.next = new_node; new_node.prev = head; head = new_node
C. new_node = Node(data); new_node.next = head; head.prev = new_node; head = new_node
D. new_node = Node(data); head.prev = new_node; new_node.next = head.next; head = new_node
Solution
Step 1: Create new node and link next pointer
new_node.next should point to current head to place it before head.
Step 2: Update previous head's prev pointer and head reference
head.prev must point back to new_node, then update head to new_node.
Final Answer:
new_node = Node(data); new_node.next = head; head.prev = new_node; head = new_node -> Option C
Quick Check:
New node next = head, head prev = new node [OK]
Hint: New node next points to head; head prev points back [OK]
Common Mistakes:
Swapping prev and next pointers
Not updating head to new node
Forgetting to update old head's prev pointer
3. What will be the output of the following code after inserting 10 at the beginning of the doubly linked list?
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
head = Node(20)
new_node = Node(10)
new_node.next = head
head.prev = new_node
head = new_node
# Print list forward
current = head
result = []
while current:
result.append(current.data)
current = current.next
print(result)
medium
A. [20, 10]
B. [10, 20]
C. [10]
D. [20]
Solution
Step 1: Insert 10 before 20
New node with data 10 points next to old head (20), old head prev points back to new node.
Step 2: Traverse from new head and collect data
Starting at head (10), next is 20, then None. So list is [10, 20].
Final Answer:
[10, 20] -> Option B
Quick Check:
List after insertion = [10, 20] [OK]
Hint: Traverse from head to next to see order [OK]
Common Mistakes:
Confusing order and printing reversed list
Not updating head pointer
Printing only one node
4. Identify the error in the following code snippet that inserts a node at the beginning of a doubly linked list:
new_node = Node(5)
new_node.next = head
head = new_node
head.prev = new_node
medium
A. head.prev should be set before updating head
B. new_node.next should be None
C. head.prev should point to None, not new_node
D. No error, code is correct
Solution
Step 1: Analyze pointer assignments
new_node.next points to old head (correct), but head = new_node happens before head.prev = new_node.
Step 2: Identify the error
By the time head.prev = new_node executes, head is already the new_node, creating a self-loop. The old head's prev is never set. head.prev must be set before updating head to link the old head back correctly.
Final Answer:
head.prev should be set before updating head -> Option A
Quick Check:
Update old head.prev before head = new_node [OK]
Hint: Set head.prev before head = new_node [OK]
Common Mistakes:
Setting prev pointer after head update incorrectly
Making first node's prev point to itself
Ignoring prev pointer for head node
5. Given a doubly linked list with nodes 30 <-> 40 <-> 50, write the sequence of node values after inserting 20 at the beginning and then 10 at the beginning. What is the final list?
hard
A. 10 <-> 30 <-> 20 <-> 40 <-> 50
B. 20 <-> 10 <-> 30 <-> 40 <-> 50
C. 30 <-> 40 <-> 50 <-> 20 <-> 10
D. 10 <-> 20 <-> 30 <-> 40 <-> 50
Solution
Step 1: Insert 20 at beginning
New node 20 points next to 30, 30 prev points to 20. List becomes 20 <-> 30 <-> 40 <-> 50.
Step 2: Insert 10 at beginning
New node 10 points next to 20, 20 prev points to 10. List becomes 10 <-> 20 <-> 30 <-> 40 <-> 50.
Final Answer:
10 <-> 20 <-> 30 <-> 40 <-> 50 -> Option D
Quick Check:
Insertions add nodes at front in order [OK]
Hint: Insertions at beginning stack nodes in reverse order [OK]
Common Mistakes:
Inserting nodes in wrong order
Appending instead of prepending
Not updating prev pointers correctly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.