Загрузка данных


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