Python implementation of a singly linked list
raise + except + raise = raise

def remove(self, index):
    try:
        if index &lt; 0 or index &gt;= self.size:
            raise ValueError

            ...

    except ValueError:
        raise ValueError('Index cannot be negative or greater than the size of the list')


It make no sense to except and raise again, simplify to:

if index &lt; 0 or index &gt;= self.size:
    raise IndexError('Index cannot be negative or greater than the size of the list')

...


The function will look like:

def insert(self, item):
    if item is None:
        raise ValueError('Cannot add None item to a list')
    self.size += 1
    if self.root is None:
        self.root = Node(item)
    else:
        p = Node(item)
        p.next = self.root
        self.root = p


for instead of counting loop

for is a more streamlined way of looping n times than a while loop:

        count = 0
        while count &lt; index:
            current = current.next
            count += 1


Becomes:

for _ in range(index):
    current = current.next


(Please note _ is a convention meaning the value will not be used)