linked lists consists of nodes nodes contain data and also may link to other nodes head node first node the address of the head node gives us access of the complete list last node points to null add an item to the linkedlist at the specified position default position is 0 the head args item any the item to add to the linkedlist position int optional the position at which to add the item defaults to 0 raises valueerror if the position is negative or out of bounds linkedlist linkedlist linkedlist add1 linkedlist add2 linkedlist add3 linkedlist add4 2 printlinkedlist 3 2 4 1 test adding to a negative position linkedlist add5 3 traceback most recent call last valueerror position must be nonnegative test adding to an outofbounds position linkedlist add5 7 traceback most recent call last valueerror out of bounds linkedlist add5 4 printlinkedlist 3 2 4 1 5 switched self isempty to self head is none because mypy was considering the possibility that self head can be none in below else part and giving error linkedlist linkedlist linkedlist add23 linkedlist add14 linkedlist add9 printlinkedlist 9 14 23 linkedlist linkedlist lenlinkedlist 0 linkedlist adda lenlinkedlist 1 linkedlist addb lenlinkedlist 2 linkedlist remove lenlinkedlist 1 linkedlist remove lenlinkedlist 0 noqa a002 add an item to the linkedlist at the specified position default position is 0 the head args item any the item to add to the linkedlist position int optional the position at which to add the item defaults to 0 raises valueerror if the position is negative or out of bounds linked_list linkedlist linked_list add 1 linked_list add 2 linked_list add 3 linked_list add 4 2 print linked_list 3 2 4 1 test adding to a negative position linked_list add 5 3 traceback most recent call last valueerror position must be non negative test adding to an out of bounds position linked_list add 5 7 traceback most recent call last valueerror out of bounds linked_list add 5 4 print linked_list 3 2 4 1 5 switched self is_empty to self head is none because mypy was considering the possibility that self head can be none in below else part and giving error linked_list linkedlist linked_list add 23 linked_list add 14 linked_list add 9 print linked_list 9 14 23 linked_list linkedlist len linked_list 0 linked_list add a len linked_list 1 linked_list add b len linked_list 2 _ linked_list remove len linked_list 1 _ linked_list remove len linked_list 0
from __future__ import annotations

from typing import Any


class Node:
    def __init__(self, item: Any, next: Any) -> None:  
        self.item = item
        self.next = next


class LinkedList:
    def __init__(self) -> None:
        self.head: Node | None = None
        self.size = 0

    def add(self, item: Any, position: int = 0) -> None:
        
        if position < 0:
            raise ValueError("Position must be non-negative")

        if position == 0 or self.head is None:
            new_node = Node(item, self.head)
            self.head = new_node
        else:
            current = self.head
            for _ in range(position - 1):
                current = current.next
                if current is None:
                    raise ValueError("Out of bounds")
            new_node = Node(item, current.next)
            current.next = new_node
        self.size += 1

    def remove(self) -> Any:
        
        
        
        if self.head is None:
            return None
        else:
            item = self.head.item
            self.head = self.head.next
            self.size -= 1
            return item

    def is_empty(self) -> bool:
        return self.head is None

    def __str__(self) -> str:
        
        if self.is_empty():
            return ""
        else:
            iterate = self.head
            item_str = ""
            item_list: list[str] = []
            while iterate:
                item_list.append(str(iterate.item))
                iterate = iterate.next

            item_str = " --> ".join(item_list)

            return item_str

    def __len__(self) -> int:
        
        return self.size