Bird
Raised Fist0
DSA Cprogramming~5 mins

Delete from End of Doubly Linked List in DSA C - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a doubly linked list?
A doubly linked list is a chain of nodes where each node has two links: one to the next node and one to the previous node. This allows moving forward and backward through the list.
Click to reveal answer
beginner
What happens when you delete the last node from a doubly linked list?
The last node is removed, the previous node's next pointer is set to NULL, and the list's tail pointer is updated to the previous node.
Click to reveal answer
intermediate
Why do we need to update the previous node's next pointer when deleting from the end?
Because the last node is removed, the previous node becomes the new last node, so its next pointer must point to NULL to mark the end of the list.
Click to reveal answer
beginner
What should you check before deleting from the end of a doubly linked list?
Check if the list is empty (head is NULL). If empty, no deletion is possible. Also, if there is only one node, deleting it makes the list empty.
Click to reveal answer
intermediate
Show the steps to delete the last node in a doubly linked list.
1. Check if list is empty; if yes, do nothing.
2. If only one node, free it and set head to NULL.
3. Otherwise, move to the last node.
4. Update previous node's next pointer to NULL.
5. Free the last node.
6. Update tail pointer if used.
Click to reveal answer
What pointer do you update when deleting the last node in a doubly linked list?
AThe head pointer
BThe next node's previous pointer
CThe previous node's next pointer
DThe current node's next pointer
What should you do if the doubly linked list has only one node and you delete from the end?
ADo nothing
BSet head to NULL after freeing the node
CSet head to the next node
DSet previous node's next to NULL
If the list is empty, what happens when you try to delete from the end?
ANothing happens, no deletion
BProgram crashes
CDeletes the head node
DDeletes a random node
Which pointer in the last node is always NULL in a doubly linked list?
ANext pointer
BPrevious pointer
CHead pointer
DTail pointer
What is the time complexity of deleting the last node in a doubly linked list if you have a tail pointer?
AO(n)
BO(n^2)
CO(log n)
DO(1)
Explain how to delete the last node from a doubly linked list step-by-step.
Think about what pointers need changing and what happens to the list structure.
You got /5 concepts.
    What are the edge cases to consider when deleting from the end of a doubly linked list?
    Consider how the list looks in each case and what pointers must be updated.
    You got /3 concepts.

      Practice

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

      Solution

      1. Step 1: Understand the tail pointer role

        The tail pointer always points to the last node in the doubly linked list.
      2. Step 2: Update tail after deletion

        When the last node is deleted, the tail pointer must move to the previous node to keep pointing to the new last node.
      3. Final Answer:

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

        Tail points 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 = tail->prev; free(tail->next); tail->next = NULL;
      B. free(tail); tail = tail->prev; tail->next = NULL;
      C. tail->prev = tail; free(tail); tail = NULL;
      D. tail->next = NULL; free(tail); tail = tail->prev;

      Solution

      1. Step 1: Free the last node correctly

        We first move tail to previous node, then free the old last node which is tail->next.
      2. Step 2: Update tail's next pointer

        After freeing, set tail->next to NULL to mark new end of list.
      3. Final Answer:

        tail = tail->prev; free(tail->next); tail->next = NULL; -> Option A
      4. Quick Check:

        Move tail first, free old node, update next pointer [OK]
      Hint: Move tail first, then free old node, update next pointer [OK]
      Common Mistakes:
      • Freeing tail before moving pointer
      • Not setting tail->next to NULL
      • Incorrect pointer assignments causing memory errors
      3. What will be the output of the following code snippet after deleting the last node?
      typedef struct Node {
        int data;
        struct Node* prev;
        struct Node* next;
      } Node;
      
      Node* tail = NULL;
      // List: 10 <-> 20 <-> 30
      // tail points to node with data 30
      
      // Delete last node
      Node* temp = tail;
      tail = tail->prev;
      free(temp);
      tail->next = NULL;
      
      // Print list from head
      Node* head = tail;
      while(head->prev) head = head->prev;
      while(head) {
        printf("%d ", head->data);
        head = head->next;
      }
      medium
      A. 10 20
      B. 10 20 30
      C. 20 30
      D. 10 30

      Solution

      1. Step 1: Understand list before deletion

        Initial list is 10 <-> 20 <-> 30, tail points to 30.
      2. Step 2: Delete last node and update pointers

        Last node 30 is freed, tail moves to 20, tail->next set to NULL.
      3. Step 3: Print list from head

        Head is found by moving to start (10), printing nodes 10 and 20.
      4. Final Answer:

        10 20 -> Option A
      5. Quick Check:

        Last node removed, list prints 10 20 [OK]
      Hint: After deletion, tail moves back; print from head to see updated list [OK]
      Common Mistakes:
      • Printing old tail node after deletion
      • Not updating tail->next to NULL
      • Starting print from tail instead of head
      4. Identify the error in the following code snippet that deletes the last node of a doubly linked list:
      void deleteEnd(Node** tail) {
        if (*tail == NULL) return;
        Node* temp = *tail;
        *tail = (*tail)->prev;
        free(temp);
        (*tail)->next = NULL;
      }
      medium
      A. Not freeing the node properly.
      B. Dereferencing tail without checking if list becomes empty.
      C. Not updating the head pointer.
      D. Using double pointer for tail unnecessarily.

      Solution

      1. Step 1: Check for empty list after deletion

        If the list had only one node, after deletion tail becomes NULL, so (*tail)->next causes error.
      2. Step 2: Fix by checking tail before dereference

        Must check if *tail is not NULL before setting (*tail)->next = NULL.
      3. Final Answer:

        Dereferencing tail without checking if list becomes empty. -> Option B
      4. Quick Check:

        Check tail NULL before accessing next pointer [OK]
      Hint: Always check if tail is NULL before accessing its members [OK]
      Common Mistakes:
      • Dereferencing NULL pointer after deletion
      • Ignoring empty list edge case
      • Not freeing memory causing leaks
      5. You have a doubly linked list with nodes: 5 <-> 15 <-> 25 <-> 35. After deleting the last node twice, what will be the printed list from head?
      // Initial tail points to 35
      // Delete last node twice
      Node* temp;
      temp = tail;
      tail = tail->prev;
      free(temp);
      tail->next = NULL;
      
      temp = tail;
      tail = tail->prev;
      free(temp);
      tail->next = NULL;
      
      // Print from head
      Node* head = tail;
      while(head->prev) head = head->prev;
      while(head) {
        printf("%d ", head->data);
        head = head->next;
      }
      hard
      A. 5 15 25
      B. 15 25
      C. 5 15
      D. 25 35

      Solution

      1. Step 1: Understand initial list and tail

        List is 5 <-> 15 <-> 25 <-> 35, tail points to 35.
      2. Step 2: Delete last node once

        Delete 35, tail moves to 25, tail->next = NULL.
      3. Step 3: Delete last node second time

        Delete 25, tail moves to 15, tail->next = NULL.
      4. Step 4: Print list from head

        Head found by moving to start (5), print nodes 5 and 15.
      5. Final Answer:

        5 15 -> Option C
      6. Quick Check:

        Two deletions remove last two nodes, list prints 5 15 [OK]
      Hint: Each delete moves tail back; print from head to see current list [OK]
      Common Mistakes:
      • Not updating tail->next to NULL after each deletion
      • Printing from tail instead of head
      • Assuming deleted nodes still exist
      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