more-python/exercises/ex13/sllist.py

138 lines
3.6 KiB
Python

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