Вы можете реализовать метод getitem
, который будет извлекать значение по индексу, и метод setitem
, чтобы обновить узел по индексу. Таким образом, простой метод swap
может быть записан путем переназначения значений:
def check_index(f):
def wrapper(cls, _val, *args):
if cls._next is None and _val:
raise IndexError(f'{_val} exceeds length of deque')
return f(cls, _val, *args)
return wrapper
class Deque:
def __init__(self, _val= None, _previous = None):
self.value = _val
self._next, self._previous = None, _previous
@check_index
def __getitem__(self, _index):
return self.value if not _index else self._next[_index-1]
@check_index
def __setitem__(self, _index, _val):
if not _index:
self.value = _val
else:
self._next[_index-1] = _val
def insert_val(self, _val, _trailing = None):
if self.value is None:
self.value = _val
else:
if self._next is None:
self._next = Deque(_val, _trailing)
else:
self._next.insert_val(_val, self._next)
def swap(self, _start, _finish):
_temp = self[_start]
self[_start] = self[_finish]
self[_finish] = _temp
def __str__(self):
return f'{self.value}, {str(self._next)}' if self._next is not None else str(self.value)
def __repr__(self):
return f'Deque({str(self)})'
d = Deque()
for i in range(10):
d.insert_val(i)
>>>d
Deque(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>>d.swap(2, 6) #swapping the third item with the 7th item
>>>d
Deque(0, 1, 6, 3, 4, 5, 2, 7, 8, 9)