A doubly linked list is a chain of nodes where each node has three parts: data, a link to the next node, and a link to the previous node. This allows moving forward and backward through the list.
Click to reveal answer
beginner
What are the three parts of a node in a doubly linked list?
A node has: 1) data (the value stored), 2) next pointer (link to the next node), and 3) previous pointer (link to the previous node).
Click to reveal answer
intermediate
Why does a doubly linked list need a previous pointer?
The previous pointer lets us move backward in the list, making it easier to traverse in both directions and to delete or insert nodes without starting from the head.
Click to reveal answer
beginner
Show a simple Python class design for a doubly linked list node.
class Node:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
Click to reveal answer
beginner
What is the difference between singly and doubly linked lists?
Singly linked lists have nodes with only a next pointer, so you can only move forward. Doubly linked lists have both next and previous pointers, so you can move forward and backward.
Click to reveal answer
What does the 'prev' pointer in a doubly linked list node point to?
AThe next node in the list
BThe tail of the list
CThe head of the list
DThe previous node in the list
✗ Incorrect
The 'prev' pointer always points to the previous node, allowing backward traversal.
Which of these is NOT a part of a doubly linked list node?
AData
BIndex number
CNext pointer
DPrevious pointer
✗ Incorrect
Nodes do not store index numbers; they only store data and pointers to next and previous nodes.
Why might you choose a doubly linked list over a singly linked list?
In Python, how do you initialize the next and previous pointers in a doubly linked list node?
Aself.next = 0, self.prev = 0
Bself.next = '', self.prev = ''
Cself.next = None, self.prev = None
Dself.next = [], self.prev = []
✗ Incorrect
Pointers are initialized to None to show they do not point to any node yet.
What happens if the previous pointer of a node is None?
AIt is the first node
BIt is the last node
CThe list is empty
DThe node is disconnected
✗ Incorrect
If prev is None, the node is the first node in the list.
Describe the structure of a doubly linked list node and explain why each part is important.
Think about how you move through the list and what information each node holds.
You got /4 concepts.
Explain the main difference between singly and doubly linked lists and when you might use each.
Consider traversal directions and ease of insertion/deletion.
You got /4 concepts.
Practice
(1/5)
1. What is the main difference between a doubly linked list node and a singly linked list node?
easy
A. A doubly linked list node does not store any data.
B. A doubly linked list node has pointers to both the previous and next nodes.
C. A doubly linked list node can only point to the next node.
D. A doubly linked list node stores data in a different format.
Solution
Step 1: Understand node pointers in singly linked list
A singly linked list node has only one pointer to the next node.
Step 2: Understand node pointers in doubly linked list
A doubly linked list node has two pointers: one to the previous node and one to the next node.
Final Answer:
A doubly linked list node has pointers to both the previous and next nodes. -> Option B
Quick Check:
Doubly linked list nodes have two pointers = D [OK]
Hint: Remember: doubly means two pointers, singly means one [OK]
Common Mistakes:
Thinking doubly linked list nodes store data differently
Confusing pointer count between singly and doubly linked lists
Assuming doubly linked list nodes have only one pointer
2. Which of the following is the correct way to define a doubly linked list node class in Python?
easy
A. class Node:
def __init__(self, data):
self.data = data
self.next = None
B. class Node:
def __init__(self, data):
self.next = None
self.prev = None
C. class Node:
def __init__(self, data):
self.data = data
self.prev = None
D. class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
Solution
Step 1: Check for data storage and pointers
A doubly linked list node must store data and have both prev and next pointers.
Step 2: Verify class definitions
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None correctly defines data, prev, and next attributes in __init__.
Final Answer:
class Node:\n def __init__(self, data):\n self.data = data\n self.prev = None\n self.next = None -> Option D
Quick Check:
Node class with data, prev, next = B [OK]
Hint: Doubly linked nodes need both prev and next pointers [OK]
Common Mistakes:
Omitting the prev pointer
Not initializing data attribute
Defining only next pointer like singly linked list
3. What will be the output of the following code snippet?
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
head = Node(1)
second = Node(2)
third = Node(3)
head.next = second
second.prev = head
second.next = third
third.prev = second
current = third
result = []
while current:
result.append(current.data)
current = current.prev
print(result)
medium
A. [3, 2, 1]
B. [1, 2, 3]
C. [1, 3, 2]
D. [3, 1, 2]
Solution
Step 1: Understand the linked list connections
Nodes are linked as 1 <-> 2 <-> 3 with prev and next pointers set correctly.
Step 2: Trace the while loop starting from third node
Starting at node with data 3, append 3, move to prev (2), append 2, move to prev (1), append 1, then prev is None, loop ends.
Final Answer:
[3, 2, 1] -> Option A
Quick Check:
Traverse backward from third node = [3, 2, 1] [OK]
Hint: Backward traversal collects nodes in reverse order [OK]
Common Mistakes:
Confusing next and prev pointers during traversal
Starting traversal from head instead of third
Appending data in wrong order
4. Identify the error in the following doubly linked list node insertion code and select the correct fix.
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
head = Node(1)
new_node = Node(2)
# Insert new_node after head
new_node.next = head.next
head.next.prev = new_node
head.next = new_node
new_node.prev = head
medium
A. No error; code inserts node correctly.
B. new_node.prev should be assigned before head.next.
C. head.next.prev causes AttributeError; fix by checking if head.next is not None before accessing prev.
D. new_node.next should be assigned after head.next.
Solution
Step 1: Analyze head.next before insertion
Initially, head.next is None, so head.next.prev causes AttributeError.
Step 2: Fix by checking if head.next exists before accessing prev
Adding a condition to check if head.next is not None before setting head.next.prev avoids error.
Final Answer:
head.next.prev causes AttributeError; fix by checking if head.next is not None before accessing prev. -> Option C
Quick Check:
Check for None before accessing prev pointer [OK]
Hint: Always check if next node exists before accessing its prev [OK]
Common Mistakes:
Ignoring None check causing runtime error
Assigning pointers in wrong order
Assuming head.next is always valid
5. You want to insert a new node with value 4 between nodes with values 2 and 3 in a doubly linked list. Given the nodes are connected as 1 <-> 2 <-> 3, which sequence of pointer updates correctly inserts the new node?