> For the complete documentation index, see [llms.txt](https://maksimdan.gitbook.io/interview-practice-problems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://maksimdan.gitbook.io/interview-practice-problems/coding_practice_questions/linked_lists/delete-middle-node.md).

# Delete Middle Node

**2.3 Delete Middle Node:** Implement an algorithm to delete a node in the middle (i.e., any node but the first and last node, not necessarily the exact middle) of a singly linked list, given only access to that node.

```
EXAMPLE
Input: the node c from the linked list a - >b- >c - >d - >e- >f
Result: nothing is returned, but the new linked list looks like a - >b- >d - >e->f
```

* Main idea is to use a slow and faster iterator. Moving the faster iterator 2x as fast as the slow means once the fast reaches the end, the slow one will be half way through.
* Then, keeping track of the previous node, we just shift pointers around, and delete the midpoint!

```cpp
Node *del_midpoint(Node *head) {
    Node *slow, *fast, *prev;
    slow = fast = head;
    prev = nullptr;
    if (!head) return slow;

    int count = 0;
    while (fast) {
        prev = slow;
        slow = slow->next;
        while (count < 2 && fast) {
            fast = fast->next;
            count++;
        }
        count = 0;
    }
    prev->next = slow->next;
    delete slow;
}
```
