Bird
Raised Fist0
DSA C++programming~5 mins

Delete from End of Doubly Linked List in DSA C++ - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Delete from End of Doubly Linked List
O(1)
Understanding Time Complexity

We want to understand how long it takes to remove the last item from a doubly linked list.

How does the time needed change as the list gets bigger?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


void deleteFromEnd(Node*& tail) {
    if (tail == nullptr) return; // empty list
    Node* toDelete = tail;
    tail = tail->prev;
    if (tail) tail->next = nullptr;
    delete toDelete;
}
    

This code removes the last node from a doubly linked list by updating the tail pointer and freeing memory.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Accessing and updating pointers of the last node.
  • How many times: This happens only once per deletion, no loops or recursion.
How Execution Grows With Input

Removing the last node always takes the same steps, no matter how big the list is.

Input Size (n)Approx. Operations
105 steps
1005 steps
10005 steps

Pattern observation: The number of steps stays the same as the list grows.

Final Time Complexity

Time Complexity: O(1)

This means deleting from the end takes a constant amount of time regardless of list size.

Common Mistake

[X] Wrong: "Deleting from the end takes longer as the list grows because you have to find the last node."

[OK] Correct: The tail pointer directly points to the last node, so no searching is needed.

Interview Connect

Knowing this helps you explain why doubly linked lists are useful for quick deletions at the end, a common interview topic.

Self-Check

"What if we only had a pointer to the head and no tail pointer? How would the time complexity change?"

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