Challenge - 5 Problems
Circular Singly Linked List Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
What is the output after inserting nodes in a circular singly linked list?
Consider the following C code that creates a circular singly linked list by inserting nodes at the end. What will be the printed output?
DSA C
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } void insertEnd(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; newNode->next = newNode; return; } Node* temp = *head; while (temp->next != *head) { temp = temp->next; } temp->next = newNode; newNode->next = *head; } void printList(Node* head) { if (head == NULL) return; Node* temp = head; do { printf("%d -> ", temp->data); temp = temp->next; } while (temp != head); printf("null\n"); } int main() { Node* head = NULL; insertEnd(&head, 10); insertEnd(&head, 20); insertEnd(&head, 30); printList(head); return 0; }
Attempts:
2 left
💡 Hint
Remember that in a circular singly linked list, the last node points back to the head, but printing stops when we reach the head again.
✗ Incorrect
The printList function prints nodes starting from head and stops when it reaches head again. So it prints 10, 20, 30 and then stops, showing '10 -> 20 -> 30 -> null'.
🧠 Conceptual
intermediate1:30remaining
What is the key difference between a circular singly linked list and a normal singly linked list?
Choose the correct statement that best describes the difference between a circular singly linked list and a normal singly linked list.
Attempts:
2 left
💡 Hint
Think about where the last node points in each list type.
✗ Incorrect
The main difference is that in a circular singly linked list, the last node's next pointer points back to the head node, forming a circle. In a normal singly linked list, the last node points to NULL.
🔧 Debug
advanced2:30remaining
Why does this circular singly linked list insertion code cause an infinite loop?
Examine the code below. It tries to insert a node at the end of a circular singly linked list but causes an infinite loop. What is the bug?
DSA C
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } void insertEnd(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; newNode->next = newNode; return; } Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; newNode->next = *head; } void printList(Node* head) { if (head == NULL) return; Node* temp = head; do { printf("%d -> ", temp->data); temp = temp->next; } while (temp != head); printf("null\n"); } int main() { Node* head = NULL; insertEnd(&head, 5); insertEnd(&head, 15); insertEnd(&head, 25); printList(head); return 0; }
Attempts:
2 left
💡 Hint
In a circular list, the last node's next is not NULL.
✗ Incorrect
The bug is in the while loop condition inside insertEnd. It checks for temp->next != NULL, but in a circular list, the last node points back to head, not NULL. So the loop never ends, causing an infinite loop.
❓ Predict Output
advanced2:30remaining
What is the output after deleting a node from a circular singly linked list?
Given the code below that deletes the node with value 20 from a circular singly linked list, what will be the printed output?
DSA C
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } void insertEnd(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; newNode->next = newNode; return; } Node* temp = *head; while (temp->next != *head) { temp = temp->next; } temp->next = newNode; newNode->next = *head; } void deleteNode(Node** head, int key) { if (*head == NULL) return; Node *curr = *head, *prev = NULL; while (curr->data != key) { if (curr->next == *head) return; // key not found prev = curr; curr = curr->next; } if (curr == *head) { Node* temp = *head; while (temp->next != *head) { temp = temp->next; } if (curr->next == *head) { free(curr); *head = NULL; } else { temp->next = curr->next; *head = curr->next; free(curr); } } else { prev->next = curr->next; free(curr); } } void printList(Node* head) { if (head == NULL) { printf("List is empty\n"); return; } Node* temp = head; do { printf("%d -> ", temp->data); temp = temp->next; } while (temp != head); printf("null\n"); } int main() { Node* head = NULL; insertEnd(&head, 10); insertEnd(&head, 20); insertEnd(&head, 30); deleteNode(&head, 20); printList(head); return 0; }
Attempts:
2 left
💡 Hint
After deleting 20, the list should contain the remaining nodes in order.
✗ Incorrect
The node with data 20 is deleted. The list now contains 10 and 30 linked circularly. The printList prints '10 -> 30 -> null'.
🧠 Conceptual
expert1:30remaining
What is the time complexity of inserting a node at the end of a circular singly linked list without a tail pointer?
Consider a circular singly linked list with only a head pointer (no tail pointer). What is the time complexity of inserting a new node at the end of the list?
Attempts:
2 left
💡 Hint
Think about how to find the last node without a tail pointer.
✗ Incorrect
Without a tail pointer, to insert at the end, you must traverse all nodes to find the last node, which takes O(n) time.
