class SingleLinkedListNode(object): def __init__(self, value): self.value = value self.next = None def __repr__(self): nval = self.next and self.next.value or None return f"[{self.value}:{repr(nval)}]" class SingleLinkedList(object): def __init__(self): self.begin = None self.end = None def count(self): """ Returns number of items. Regresa la cantidad de ítems. """ count = 0 node = self.begin while node: count += 1 node = node.next return count def push(self, obj): """ Appends a new item on the end of the list. Añade un nuevo ítem al final de la lista. """ node = SingleLinkedListNode(obj) if self.begin is None: self.begin = node self.end = self.begin else: self.end.next = node self.end = node def pop(self): """ Removes the last item and returns its value. Remueve el último ítem y regresa su valor. """ if self.end is None: value = None elif self.end == self.begin: value = self.end.value self.end = self.begin = None else: node = self.begin while node.next != self.end: node = node.next value = node.next.value self.end = node self.end.next = None return value def unshift(self): """ Removes the first item and returns its value. Remueve el primer ítem y regresa su valor. """ if self.begin is None: value = None elif self.begin == self.end: value = self.begin.value self.begin = self.end = None else: value = self.begin.value self.begin = self.begin.next return value def shift(self, obj): """ Appends a new item on the begin of the list. Añade un nuevo ítem al inicio de la lista. """ node = SingleLinkedListNode(obj) if self.begin is None: self.begin = node self.end = self.begin else: curr, total = 0, self.count() self.push(node.value) while curr < total: self.push(self.unshift()) curr += 1 def remove(self, obj): """ Removes a item by its value and return its list index. Remueve un ítem según su valor y regresa su índice en la lista. """ count = 0 node = self.begin while node.next: if obj == node.value: break count += 1 node = node.next if node.next: node.value = node.next.value node.next = node.next.next else: node = None return count def get(self, index): """ Returns item value at list index. Regresa el valor del ítem en el índice de la lista. """ count = 0 node = self.begin while count != index: count += 1 node = node.next if node: return node.value else: return None def first(self): """ Returns value of first item. Regresa el valor del primer ítem. """ return self.begin.value def last(self): """ Returns value of last item. Regresa el valor del último ítem. """ return self.end.value