135 lines
3.6 KiB
Python
135 lines
3.6 KiB
Python
|
class DoubleLinkedListNode(object):
|
||
|
def __init__(self, value, prev, nxt):
|
||
|
self.value = value
|
||
|
self.next = nxt
|
||
|
self.prev = prev
|
||
|
|
||
|
def __repr__(self):
|
||
|
nval = self.next and self.next.value or None
|
||
|
pval = self.prev and self.prev.value or None
|
||
|
return f"[{repr(pval)}, {self.value}, {repr(nval)}]"
|
||
|
|
||
|
|
||
|
class DoubleLinkedList(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 = DoubleLinkedListNode(obj, self.end, None)
|
||
|
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
|
||
|
else:
|
||
|
value = self.end.value
|
||
|
if self.end == self.begin:
|
||
|
self.end = self.begin = None
|
||
|
else:
|
||
|
self.end = self.end.prev
|
||
|
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
|
||
|
else:
|
||
|
value = self.begin.value
|
||
|
if self.begin == self.end:
|
||
|
self.begin = self.end = None
|
||
|
else:
|
||
|
self.begin = self.begin.next
|
||
|
self.begin.prev = None
|
||
|
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 = DoubleLinkedListNode(obj, None, self.begin)
|
||
|
if self.begin is None:
|
||
|
self.begin = node
|
||
|
self.end = self.begin
|
||
|
else:
|
||
|
self.begin.prev = node
|
||
|
self.begin = node
|
||
|
|
||
|
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.value = node.next = node.prev = 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
|