class Node:
def __init__(self, val):
self.val = val
self.next = None
class Linked_list:
def __init__(self, lst=[]):
if not lst:
self.head = None
self.size = 0
return
self.head = Node(lst[0])
cur = self.head
for i in range(1, len(lst)):
cur.next = Node(lst[i])
cur = cur.next
def __str__(self):
if not self.head:
return'empty'
a = ''
cur = self.head
while cur:
a += f'{cur.val}'
cur = cur.next
a += f'{cur.val}'
return a
def __get_item__(self, idx):
if idx > self.size -1 :
raise IndexError("out of range")
cur = self.head
cur_idx = 0
while cur_idx != idx:
cur = cur.next
cur_idx +=1
return cur
def __getitem__(self, idx):
target = self.__get_item__(idx)
return target.val
def __setitem__(self, idx, value):
target = self.__get_item__(idx)
target.val =value
def __iter__(self):
cur = self.head
while cur:
yield cur.val
cur = cur.next
def append(self,val):
if not self.head:
self.head = Node(val)
self.size +=1
return
target = self.__get__item(-1)
target.next = Node(val)
self.size+=1
def is_empty(self):
return self.head == Node
def insert(self,idx,val):
new_node=Node(val)
if idx == 0:
new_node.next=self.head
self.head = new_node
return
else:
target =self.__get_item__(idx - 1)
new_node.next = target.next
target.next = new_node
self.size +=1
def remove(self, val):
cur = self.head
prev = None
while cur and cur.val != val:
prev, cur = cur, cur.next
if cur is None:
raise ValueError(f'{val} not in list')
if prev is None:
self.head = cur.next
else:
prev.next = cur.next
self.size -= 1
def pop(self,idx = -1):
if idx ==0:
tmp = self.head.val
self.head=self.head.next
else:
target=self.__get_item__(idx -1)
tmp = target.next.val
target.next=target.next.next
self.size -=1
return tmp
def swap(self,idx1,idx2):
tmp1, tmp2 = self.__get_item__(idx1), self.__get_item__(idx2)
tmp1.val, tmp2.val = tmp2.val,tmp1.val
def reverse(self):
prev = None
cur = self.head
while cur:
nxt = cur.next
cur.next = prev
prev = cur
cur = nxt
self.head = prev