Pls explain this code to me
class node: def __init__(self, data = None, next = None): self.data = data self.next = next class linked_list: def __init__(self): self.head = None # function to add a node at front def add_at_front(self, data): self.head = node(data=data, next=self.head) # function to check whether the list is empty def is_empty(self): return self.head == None # function to add node at the end def add_at_end(self, data): if not self.head: self.head = node(data=data) return curr = self.head while curr.next: curr = curr.next curr.next = node(data=data) # function to delete any node def delete_node(self, key): curr = self.head prev = None while curr and curr.data != key: prev = curr curr = curr.next if prev is None: self.head = curr.next elif curr: prev.next = curr.next