Bird
0
0
DSA Cprogramming~20 mins

Doubly Linked List Structure and Node Design in DSA C - Practice Problems & Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Doubly Linked List Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of Doubly Linked List Node Insertion
What is the printed state of the doubly linked list after inserting nodes with values 10, 20, and 30 at the end?
DSA C
typedef struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
} Node;

#include <stdio.h>
#include <stdlib.h>

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

void insertEnd(Node** head, int data) {
    Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    Node* temp = *head;
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = newNode;
    newNode->prev = temp;
}

void printList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("%d <-> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main() {
    Node* head = NULL;
    insertEnd(&head, 10);
    insertEnd(&head, 20);
    insertEnd(&head, 30);
    printList(head);
    return 0;
}
A10 <-> 20 <-> 30 <-> NULL
B30 <-> 20 <-> 10 <-> NULL
C10 -> 20 -> 30 -> NULL
DNULL
Attempts:
2 left
💡 Hint
Trace the insertEnd function to see how nodes are linked at the end.
Predict Output
intermediate
2:00remaining
Output after Deleting a Node from Doubly Linked List
Given a doubly linked list with nodes 5 <-> 15 <-> 25 <-> NULL, what is the printed list after deleting the node with value 15?
DSA C
typedef struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
} Node;

#include <stdio.h>
#include <stdlib.h>

void printList(Node* head) {
    Node* temp = head;
    while (temp != NULL) {
        printf("%d <-> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

void deleteNode(Node** head, int key) {
    Node* temp = *head;
    while (temp != NULL && temp->data != key) {
        temp = temp->next;
    }
    if (temp == NULL) return;
    if (*head == temp) *head = temp->next;
    if (temp->next != NULL) temp->next->prev = temp->prev;
    if (temp->prev != NULL) temp->prev->next = temp->next;
    free(temp);
}

int main() {
    Node* head = createNode(5);
    Node* second = createNode(15);
    Node* third = createNode(25);
    head->next = second;
    second->prev = head;
    second->next = third;
    third->prev = second;

    deleteNode(&head, 15);
    printList(head);
    return 0;
}
A5 <-> NULL
B5 <-> 15 <-> 25 <-> NULL
C15 <-> 25 <-> NULL
D5 <-> 25 <-> NULL
Attempts:
2 left
💡 Hint
Check how pointers are updated when the node with value 15 is removed.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Node Insertion at Beginning
What is the error in this code that inserts a node at the beginning of a doubly linked list?
DSA C
void insertBeginning(Node** head, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = *head;
    if (*head != NULL) {
        (*head)->prev = newNode;
    }
    // Missing update here
}
AMemory allocation for new node is missing.
BThe new node's next pointer is not set correctly.
CThe head pointer is not updated to point to the new node.
DThe previous pointer of the old head is not updated.
Attempts:
2 left
💡 Hint
After inserting at beginning, head must point to new node.
Predict Output
advanced
2:00remaining
Output of Traversing Doubly Linked List Backwards
Given a doubly linked list 1 <-> 2 <-> 3 <-> NULL, what is the output when traversing from tail to head?
DSA C
typedef struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
} Node;

#include <stdio.h>
#include <stdlib.h>

void printReverse(Node* tail) {
    Node* temp = tail;
    while (temp != NULL) {
        printf("%d <-> ", temp->data);
        temp = temp->prev;
    }
    printf("NULL\n");
}

int main() {
    Node* head = (Node*)malloc(sizeof(Node));
    Node* second = (Node*)malloc(sizeof(Node));
    Node* third = (Node*)malloc(sizeof(Node));

    head->data = 1; head->prev = NULL; head->next = second;
    second->data = 2; second->prev = head; second->next = third;
    third->data = 3; third->prev = second; third->next = NULL;

    printReverse(third);
    return 0;
}
A3 <-> 2 <-> 1 <-> NULL
B1 <-> 2 <-> 3 <-> NULL
CNULL
D1 -> 2 -> 3 -> NULL
Attempts:
2 left
💡 Hint
Traverse using prev pointers starting from tail node.
🧠 Conceptual
expert
2:00remaining
Why is a Doubly Linked List More Suitable than Singly Linked List for Certain Operations?
Which reason best explains why doubly linked lists are preferred over singly linked lists for operations like backward traversal and deletion of a given node?
ABecause doubly linked lists use less memory than singly linked lists, making them faster.
BBecause doubly linked lists store pointers to both previous and next nodes, enabling easy backward traversal and direct node deletion without traversal from head.
CBecause doubly linked lists do not require pointers, simplifying node management.
DBecause doubly linked lists automatically sort nodes, improving search speed.
Attempts:
2 left
💡 Hint
Think about how having two pointers per node helps in navigation and deletion.