class Node:
    def __init__(self,data):
        self.data = data
        self.pref = None
        self.nref = None
class DoublyLL:
    def __init__(self):
        self.head=None
    def print_LL_forward(self):       
        if self.head is None:
            print("Linked List is Empty! ")
        else:
            n = self.head
            while n is not None:
                print(n.data , "-->" ,end=" ")
                n = n.nref
    def print_LL_reverse(self):
        print()
        if self.head is None:
            print("Linked List is Empty! ")
        else:
            n=self.head
            while n.nref is not None:
                n = n.nref
            while n is not None:
                print(n.data , "-->" ,end=" ")
                n = n.pref
    def insert_empty(self,data):
        if self.head is None:
            new_node = Node(data)
            self.head = new_node
        else:
            print("LL is not Empty")
    def add_begin(self,data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
        else:
            new_node.nref = self.head
            self.head.pref = new_node
            self.head = new_node 
    def add_end(self,data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
        else:
            n = self.head
            while n.nref is not None:             
                 n = n.nref
            n.nref = new_node
            new_node.pref = n
    def add_after(self,data,x):
        if self.head is None:
            print("LL is empty , so Node cannot be added! ")
        else:
            n = self.head
            while n is not None:
                if x==n.data:
                    break
                n = n.nref
            if n is None:
                print("Node is not present in LL")
            else:
                new_node = Node(data)
                new_node.nref = n.nref
                new_node.pref = n
                if n.nref is not None:
                    n.nref.pref = new_node
                n.nref = new_node
        
    def add_before(self,data,x):
         if self.head is None:
            print("LL is empty , so Node cannot be added! ")        
         else:
             n = self.head
             while n is not None:
                if x==n.data:
                    break
                n = n.nref
             if n is None:
                print("Node is not present in LL")
             else:                
                 new_node = Node(data)
                 new_node.pref = n
                 new_node.nref = n.pref
                 if n.pref is not None:
                    n.pref.nref = new_node
                 else:                   
                     self.head = new_node
                 n.pref = new_node
                
                
         
 
dl1 = DoublyLL()
dl1.add_begin(30)
dl1.add_end(50)
dl1.add_before(40,30)
dl1.print_LL_forward()
dl1.print_LL_reverse()
Why is this program printing continuously in a loop rather than displaying it for only a single time?
It always crashes my compiler.
 
    