Bird
Raised Fist0
DSA C++programming~20 mins

Delete from End of Doubly Linked List in DSA C++ - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Doubly Linked List Deletion Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output after deleting last node from doubly linked list
What is the printed state of the doubly linked list after deleting the last node?
DSA C++
struct Node {
    int data;
    Node* prev;
    Node* next;
};

void deleteFromEnd(Node*& head) {
    if (!head) return;
    if (!head->next) {
        delete head;
        head = nullptr;
        return;
    }
    Node* temp = head;
    while (temp->next) {
        temp = temp->next;
    }
    temp->prev->next = nullptr;
    delete temp;
}

void printList(Node* head) {
    while (head) {
        std::cout << head->data << " -> ";
        head = head->next;
    }
    std::cout << "null" << std::endl;
}

int main() {
    Node* head = new Node{1, nullptr, nullptr};
    head->next = new Node{2, head, nullptr};
    head->next->next = new Node{3, head->next, nullptr};
    deleteFromEnd(head);
    printList(head);
    return 0;
}
A2 -> 3 -> null
B1 -> 2 -> 3 -> null
C1 -> null
D1 -> 2 -> null
Attempts:
2 left
💡 Hint
Think about what happens to the last node and its previous node's next pointer.
❓ Predict Output
intermediate
2:00remaining
Output after deleting last node from single-node doubly linked list
What is the printed state of the doubly linked list after deleting the last node when the list has only one node?
DSA C++
struct Node {
    int data;
    Node* prev;
    Node* next;
};

void deleteFromEnd(Node*& head) {
    if (!head) return;
    if (!head->next) {
        delete head;
        head = nullptr;
        return;
    }
    Node* temp = head;
    while (temp->next) {
        temp = temp->next;
    }
    temp->prev->next = nullptr;
    delete temp;
}

void printList(Node* head) {
    while (head) {
        std::cout << head->data << " -> ";
        head = head->next;
    }
    std::cout << "null" << std::endl;
}

int main() {
    Node* head = new Node{10, nullptr, nullptr};
    deleteFromEnd(head);
    printList(head);
    return 0;
}
Anull
B10 -> null
C10
D0 -> null
Attempts:
2 left
💡 Hint
Deleting the only node should leave the list empty.
🔧 Debug
advanced
2:00remaining
Identify the error in deleteFromEnd function
What error will occur when running this deleteFromEnd function on a doubly linked list with multiple nodes?
DSA C++
void deleteFromEnd(Node*& head) {
    if (!head) return;
    Node* temp = head;
    while (temp->next) {
        temp = temp->next;
    }
    temp->next = nullptr;
    delete temp;
}
ASyntax error due to missing semicolon
BNo error, function works correctly
CRuntime error due to deleting node but not updating previous node's next pointer
DMemory leak because node is not deleted
Attempts:
2 left
💡 Hint
Check what happens to the previous node's next pointer after deletion.
❓ Predict Output
advanced
2:00remaining
Output after deleting last node twice from doubly linked list
What is the printed state of the doubly linked list after deleting the last node twice in a row?
DSA C++
struct Node {
    int data;
    Node* prev;
    Node* next;
};

void deleteFromEnd(Node*& head) {
    if (!head) return;
    if (!head->next) {
        delete head;
        head = nullptr;
        return;
    }
    Node* temp = head;
    while (temp->next) {
        temp = temp->next;
    }
    temp->prev->next = nullptr;
    delete temp;
}

void printList(Node* head) {
    while (head) {
        std::cout << head->data << " -> ";
        head = head->next;
    }
    std::cout << "null" << std::endl;
}

int main() {
    Node* head = new Node{5, nullptr, nullptr};
    head->next = new Node{10, head, nullptr};
    head->next->next = new Node{15, head->next, nullptr};
    deleteFromEnd(head);
    deleteFromEnd(head);
    printList(head);
    return 0;
}
A5 -> null
B5 -> 10 -> null
C10 -> 15 -> null
Dnull
Attempts:
2 left
💡 Hint
Each deletion removes the last node, so after two deletions, one node remains.
🧠 Conceptual
expert
2:00remaining
Why is updating the previous node's next pointer necessary when deleting from end?
In a doubly linked list, why must we update the previous node's next pointer to nullptr when deleting the last node?
ATo make the list circular by linking last node to head
BTo avoid leaving a dangling pointer that points to deleted memory, preventing undefined behavior
CTo increase the size of the list by adding a new node
DTo reset the head pointer to nullptr
Attempts:
2 left
💡 Hint
Think about what happens if the previous node still points to the deleted node.

Practice

(1/5)
1. What happens to the tail pointer when you delete the last node from a doubly linked list?
easy
A. It moves to the previous node of the deleted node
B. It becomes null immediately
C. It points to the head node
D. It remains unchanged

Solution

  1. Step 1: Understand the tail pointer role

    The tail pointer always points to the last node in the list.
  2. Step 2: Effect of deleting the last node

    When the last node is deleted, the tail must move to the previous node to remain the last node.
  3. Final Answer:

    It moves to the previous node of the deleted node -> Option A
  4. Quick Check:

    Tail updates to previous node after deletion [OK]
Hint: Tail always points to last node, update to previous on delete [OK]
Common Mistakes:
  • Setting tail to null without checking if list is empty
  • Not updating tail pointer after deletion
  • Pointing tail to head incorrectly
2. Which of the following is the correct syntax to delete the last node in a doubly linked list in C++?
easy
A. tail->prev = tail; delete tail; tail = nullptr;
B. delete tail; tail = tail->prev; tail->next = nullptr;
C. tail = tail->prev; delete tail->next; tail->next = nullptr;
D. tail->next = nullptr; delete tail; tail = tail->prev;

Solution

  1. Step 1: Identify correct order of operations

    First, move tail pointer to previous node, then delete the old last node, and finally set new tail's next to nullptr.
  2. Step 2: Match with options

    tail = tail->prev; delete tail->next; tail->next = nullptr; correctly moves tail, deletes old node, and updates next pointer.
  3. Final Answer:

    tail = tail->prev; delete tail->next; tail->next = nullptr; -> Option C
  4. Quick Check:

    Move tail first, then delete old node [OK]
Hint: Move tail before deleting old node to avoid dangling pointer [OK]
Common Mistakes:
  • Deleting tail before moving pointer causes invalid access
  • Not setting tail->next to nullptr after deletion
  • Incorrect pointer assignments causing memory leaks
3. What will be the output of the following code snippet after deleting the last node?
struct Node {
  int data;
  Node* prev;
  Node* next;
};

Node* head = new Node{1, nullptr, nullptr};
Node* second = new Node{2, head, nullptr};
head->next = second;
Node* tail = second;

// Delete last node
Node* temp = tail;
tail = tail->prev;
tail->next = nullptr;
delete temp;

// Print list
Node* curr = head;
while(curr) {
  std::cout << curr->data << " ";
  curr = curr->next;
}
medium
A. 1 2
B. No output (empty list)
C. 2
D. 1

Solution

  1. Step 1: Understand list before deletion

    List has two nodes: 1 (head) -> 2 (tail).
  2. Step 2: Delete last node and update pointers

    Last node (2) is deleted, tail moves to node 1, and tail->next is set to nullptr.
  3. Step 3: Print remaining list

    Only node 1 remains, so output is "1".
  4. Final Answer:

    1 -> Option D
  5. Quick Check:

    Last node deleted, only head remains [OK]
Hint: After deleting tail, print from head to see remaining nodes [OK]
Common Mistakes:
  • Printing deleted node due to not updating tail->next
  • Assuming list is empty after deletion
  • Confusing head and tail pointers
4. Identify the error in the following code that deletes the last node of a doubly linked list:
void deleteEnd(Node*& tail) {
  delete tail;
  tail = tail->prev;
  tail->next = nullptr;
}
medium
A. Not updating head pointer causes memory leak
B. Accessing tail->prev after deleting tail causes undefined behavior
C. tail->next should be set to tail->prev
D. No error, code is correct

Solution

  1. Step 1: Analyze order of operations

    The code deletes tail first, then tries to access tail->prev which is invalid after deletion.
  2. Step 2: Correct approach

    First move tail pointer to previous node, then delete the old tail node, and update pointers.
  3. Final Answer:

    Accessing tail->prev after deleting tail causes undefined behavior -> Option B
  4. Quick Check:

    Delete after pointer update to avoid invalid access [OK]
Hint: Move pointer before delete to avoid invalid memory access [OK]
Common Mistakes:
  • Deleting node before updating pointers
  • Not checking if tail is nullptr before access
  • Confusing order of pointer updates and deletion
5. Given a doubly linked list with nodes containing values [10, 20, 30, 40], write the steps to delete the last node and update the list correctly. What will be the final list after deletion?
hard
A. [10, 20, 30]
B. [10, 20, 30, 40]
C. [20, 30, 40]
D. [10, 20, 40]

Solution

  1. Step 1: Identify the last node and tail pointer

    The last node has value 40, tail points to it.
  2. Step 2: Move tail pointer to previous node and delete last node

    Tail moves to node with value 30, delete node 40, set tail->next to nullptr.
  3. Step 3: Final list after deletion

    List nodes are now 10 -> 20 -> 30 with tail at 30.
  4. Final Answer:

    [10, 20, 30] -> Option A
  5. Quick Check:

    Last node removed, tail updated, list shortened [OK]
Hint: Delete last node, move tail back, set tail->next null [OK]
Common Mistakes:
  • Not updating tail->next to nullptr
  • Deleting wrong node or skipping pointer updates
  • Assuming list shrinks from head instead of tail
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard