class linkedList:
    class listNode:
        def __init__(self, data, next = None):
            self.info = data
            self.next = next
        def getInfo(self):
            return self.info
        def setInfo(self, value):
            self.info = value
        def getNext(self):
            return self.next
        def setNext(self, ptr):
            selfNext = ptr
    ########## End of class listNode##############   
    def __init__(self):
         self.head = None  #Start of list
         self.last = None
         self.size = 0     #Size of list
    def __del__(self):
        current = self.head
        while current:
            ptr = current
            current = current.next
            del ptr
    def getSize(self):
         return self.size
    def isEmpty(self):
         return self.head == None
  #------------------------------------      
    def searchNode(self, data):
        if (self.isEmpty()):
            return None
        else:
            ptr = self.head 
            found = False
            while ptr and found is False:
                if ptr.getInfo() == data:
                    found = True
                else:
                    ptr = ptr.getNext()
        return ptr
 #------------------------------------                 
    def insertAtFirst(self, ptr):
        self.head = ptr
        self.size +=1
        if self.getSize() == 1: 
            self.last = self.head 
        return True
  #------------------------------------   
    def insertAfterNode(self, ptr):
         if (self.isEmpty()):
             self.head = self.last = ptr
         else:
             self.last.next = ptr
             self.last = ptr
         self.size += 1
 #------------------------------------   
    def deleteNode(self, data):
           current = self.head
           pre = None
           found = False
           while current and found is False:
               if current.getInfo() == data:
                   found = True
               else:
                   pre = current
                   current = current.getNext()
           if found:
                if current == self.head: #first node deleted
                    self.head = current.next
                    del current 
                else:
                    pre.next = current.next
                    current.next = None
                    del current #current = None
                self.size -= 1
           return found
  #------------------------------------       
    def traverse(self):
        if (self.isEmpty() != True):
            ptr = self.head
            while ptr:
                print(ptr.info, end = "\n")
                ptr = ptr.getNext()
