Here shows 3 Approaches to slove this problem: Brute Force, Stack, Slow Fast Pointers.
Brute Froce
It’s easy to think of the way that we traverse the linked list first, from the head node to the end node, to get the length of the linked list \(L\).
Then we traverse the linked list from the head node again. When the \(L-n+1\) th node is traversed, it is the node we need to delete.
We can traverse \(L-n+1\) nodes starting from the dummy node. When traversing to the \(L-n+1\)th node, its next node is the node we need to delete, so we only need to modify the pointer once to complete the deletion operation.
It’s like Leetcode 11. Container With Most Water , we can consider the black block as a wall, the blue block as water. Given an array, each element represents the height of the wall from left to right, find out how many units of water can be held.
procedure BFS(G, source) is let Q be a queue label source as explored Q.enqueue(source) while Q is not empty do v := Q.dequeue() if v is the goal then return v for all edges from v to w in G.adjacentEdges(v) do if w is not labeled as explored then label w as explored w.parent := v Q.enqueue(w)