def push_front(self, val):
     newNode = ListNode(val, None)
     if self._size == 0:  #if list is empty, make element the head and tail
         self._head = newNode
         self._tail = newNode
     newNode.set_next(
         self._head)  #new element's next now points to current head
     self._head = newNode  #update list's head
     self._size += 1  #update list's size
 def insert(self, index, val):
     if index >= self._size or index < 0:
         raise IndexError('Invalid index')
     if index == 0:
         self.push_front(val)
     else:
         newNode = ListNode(val, None)
         item = self._head
         for i in range(index -
                        1):  #traverse list to find item at index - 1
             item = item.get_next()
         newNode.set_next(item.get_next())
         item.set_next(newNode)
     self._size += 1