class Node:
def __init__(self, val):
self.val = val
self.next = None
self.prev = None
class Double_Linked_List:
def __init__(self, *lst):
self.head = self.tail = None
self.size = 0
for node in lst:
self.append(node)
def __len__(self):
return self.size
def __str__(self):
if not self.head:
return "empty"
cur = self.head
res = ""
while cur:
if not cur.next:
res +=f"{cur.val}"
break
res +=f"{cur.val}<>"
cur = cur.next
return res
def __get_item__(self, idx):
return self._node_at(idx)
def __getitem__(self, key):
return self.__get_node(key).val
def __setitem__(self, idx, value):
self._node_at(idx).val = value
def append(self, val):
new_node = Node(val)
self.size +=1
if not self.head:
self.head= self.tail = new_no
new_node.prev =self.tail
self.tail =new_node
def __get_node(self, idx):
if idx <0:
idx += self.size
if idx > self.size -1 or idx <0:
raise IndexError('index out of range')
if idx > self.size // 2:
cur = self.tail
cur_idx = self.size - 1
while cur_idx != idx:
cur = cur.prev
cur_idx -= 1
return cur
else:
cur = self.head
cur_idx = 0
while cur_idx != idx
if idx > self.size // 2:
cur = self.tail
cur_idx = self.size -1
while cur_idx !=idx:
cur = cur.prev
cur_idx -=1
return cur
else:
cur = self.head
cur_idx = 0
while cur_idx !=idx:
cur =cur.next
cur_idx+=1
return cur
def insert(self, idx, val):
pass
def remove(self, val):
pass
def pop(self, idx=-1):
pass
def swap(self, idx1, idx2):
pass
def reverse(self):
pass