A singly linked list is a chain of nodes where each node holds data and a link to the next node. It starts at a head node and ends when a node points to null (no next node).
Click to reveal answer
beginner
What are the two main parts of a node in a singly linked list?
Each node has two parts: 1. Data: stores the value or information. 2. Next: a reference (link) to the next node in the list or null if it is the last node.
Click to reveal answer
intermediate
How do you add a new node at the end of a singly linked list?
To add a node at the end: 1. Create the new node. 2. Start from the head and move through nodes until you find the last node (next is null). 3. Set the last node's next to the new node. 4. The new node's next is null.
Click to reveal answer
beginner
Why do singly linked lists not allow backward traversal?
Because each node only has a link to the next node, there is no reference to the previous node. So, you can only move forward from the head to the end.
Click to reveal answer
intermediate
What is the time complexity to find the last node in a singly linked list?
It is O(n), where n is the number of nodes, because you must check each node from the head until you reach the last node.
Click to reveal answer
What does the 'next' part of a node in a singly linked list store?
AReference to the next node
BData value
CReference to the previous node
DLength of the list
✗ Incorrect
The 'next' part stores the reference (link) to the next node in the list.
What is the first node in a singly linked list called?
ATail
BLeaf
CRoot
DHead
✗ Incorrect
The first node is called the head.
If a singly linked list has 5 nodes, how many steps to reach the last node from the head?
A1
B4
C5
D3
✗ Incorrect
You must move through 4 links to reach the 5th node starting from the head.
Which operation is easiest in a singly linked list?
ATraverse backwards
BInsert before a node without previous pointer
CInsert at the end if tail pointer is known
DDelete last node without previous pointer
✗ Incorrect
If you keep a tail pointer, inserting at the end is easy and fast.
What happens if you try to access the next node of the last node?
AYou get null (no node)
BYou get an error always
CYou get the head node
DYou get the previous node
✗ Incorrect
The last node's next is null, meaning no next node exists.
Explain how to create a singly linked list from scratch and add nodes to it.
Think about how each node connects to the next and how you find the end.
You got /4 concepts.
Describe the difference between singly linked list and arrays in terms of structure and traversal.
Focus on how elements are stored and accessed.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of a Singly Linked List in data structures?
easy
A. To store elements with keys and values for fast lookup
B. To store elements in a sequence where each element points to the next
C. To store elements in a sorted array for binary search
D. To store elements in a tree structure with parent and child nodes
Solution
Step 1: Understand the structure of a singly linked list
A singly linked list stores elements in nodes where each node points to the next node, forming a chain.
Step 2: Compare with other data structures
Unlike arrays or trees, singly linked lists do not store keys or have parent-child relationships; they only link sequentially.
Final Answer:
To store elements in a sequence where each element points to the next -> Option B
Quick Check:
Singly Linked List = sequence with next pointers [OK]
Hint: Remember: singly linked list nodes point only forward [OK]
Common Mistakes:
Confusing linked lists with arrays or hash maps
Thinking nodes have backward pointers (that's doubly linked list)
Assuming linked lists store key-value pairs
2. Which of the following is the correct way to define a node class for a singly linked list in Python?
easy
A. class Node:
def __init__(self, data, next):
self.data = data
self.next = next
self.prev = None
B. class Node:
def __init__(self, data):
self.data = data
self.prev = None
C. class Node:
def __init__(self, data):
self.data = data
self.next = None
D. class Node:
def __init__(self):
self.data = None
self.next = None
self.prev = None
Solution
Step 1: Identify the correct attributes for a singly linked list node
A singly linked list node stores data and a pointer to the next node only, so it needs data and next.
Step 2: Check the constructor parameters and attributes
class Node:
def __init__(self, data):
self.data = data
self.next = None correctly initializes data and sets next to None by default. Other options include prev which is for doubly linked lists or incorrect parameters.
Final Answer:
class Node:
def __init__(self, data):
self.data = data
self.next = None -> Option C
Quick Check:
Node has data and next only [OK]
Hint: Singly linked list nodes have no 'prev' pointer [OK]
Common Mistakes:
Adding a 'prev' pointer by mistake
Not initializing 'next' to None
Using extra parameters unnecessarily
3. What will be the output of the following code that creates a singly linked list with nodes 10, 20, 30 and prints the list?
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
return
last = self.head
while last.next:
last = last.next
last.next = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None')
ll = LinkedList()
ll.append(10)
ll.append(20)
ll.append(30)
ll.print_list()
medium
A. 10 -> 20 -> None
B. 30 -> 20 -> 10 -> None
C. None
D. 10 -> 20 -> 30 -> None
Solution
Step 1: Trace the append method calls
Appending 10 sets head to node with data 10. Then 20 and 30 are added at the end by traversing the list.
Step 2: Trace the print_list method
Prints nodes in order: 10, then 20, then 30, each followed by ' -> ', ending with 'None'.
Final Answer:
10 -> 20 -> 30 -> None -> Option D
Quick Check:
Append adds at end, print shows order [OK]
Hint: Append adds nodes at list end; print shows order [OK]
Common Mistakes:
Assuming append adds at front
Printing without 'None' at end
Confusing order of nodes
4. The following code tries to append nodes to a singly linked list but does not work as expected. What is the error?
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
last = self.head
while last.next:
last = last.next
last = new_node
ll = LinkedList()
ll.append(1)
ll.append(2)
ll.append(3)
current = ll.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None')
medium
A. The line 'last = new_node' does not link the new node to the list
B. The head is never initialized
C. The Node class is missing the 'prev' pointer
D. The while loop condition should be 'while last is not None'
Solution
Step 1: Analyze the append method's else block
The code finds the last node correctly but then does 'last = new_node' which only changes the local variable, not the last node's next pointer.
Step 2: Identify the fix
To link the new node, it should be 'last.next = new_node' to update the last node's next pointer.
Final Answer:
The line 'last = new_node' does not link the new node to the list -> Option A
Quick Check:
Assign to last.next to link nodes [OK]
Hint: Update last.next, not last variable, to link nodes [OK]
Common Mistakes:
Assigning new_node to last instead of last.next
Not updating the head when list is empty
Confusing variable assignment with pointer update
5. You want to create a singly linked list from scratch that supports inserting a new node at the beginning and printing the list. Which code snippet correctly implements this?
hard
A. class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None')
B. class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.prev = self.head
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None')
C. class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None')
D. class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.next = None
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None')
Solution
Step 1: Understand insert at beginning logic
To insert at the beginning, new node's next should point to current head, then head updated to new node.
Step 2: Check each option's insert_at_beginning method
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None') correctly sets new_node.next = self.head and updates head. class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.prev = self.head
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None') wrongly uses prev pointer. class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None') misses linking new_node.next. class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert_at_beginning(self, data):
new_node = Node(data)
new_node.next = None
self.head = new_node
def print_list(self):
current = self.head
while current:
print(current.data, end=' -> ')
current = current.next
print('None') sets new_node.next to None, losing old list.
Final Answer:
Option A code snippet correctly inserts at beginning and prints list -> Option A
Quick Check:
New node points to old head, then head updated [OK]
Hint: New node's next = old head; update head to new node [OK]
Common Mistakes:
Not linking new node to old head
Using prev pointer in singly linked list
Setting new_node.next to None incorrectly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.