Removes at index

        :param position: Index of removal
        :return: bool: True iff removal completed successfully

def remove(self, position):
        """Removes at index

        :param position: Index of removal
        :return: bool: True iff removal completed successfully
        """
        if position <= 0:  # at beginning
            return self.remove_first()

        if position >= self.length() - 1:  # at end
            return self.remove_last()

        counter = 0
        last_node = self.head
        current_node = self.head

        while current_node is not None and counter <= position:
            if counter == position:
                last_node.next_node = current_node.next_node  # remove current
                return True

            last_node = current_node
            current_node = current_node.next_node
            counter += 1

        return False