Delete a node
Given a pointer to a node, delete that node preferably in O(1)
Solution
- If the node is not the last node then we can copy the data from then next node, delete the next node and adjust the pointers
 - If the node is the last, then we'll have to traverse the list and find prev to last node and then delete the last node
 - Tradeoff: If there are any pointers to the next node, they will become dangling pointers
 
Code
def delete_node(head, node)
    if node.next != NULL
        node.data = node.next.data
        node.next = node.next.next
    else
        prev = find_prev(head)
        prev.next = NULL
    end
end
Complexity
O(1) when the node to be deleted is not the last node in the list O(n) if it is the last node