https://python.plainenglish.io/data-structures-and-algorithms-every-python-programmer-should-know-part-ii-a29382268800