input: 
  from typing import Any
  
  class Node:
      def __init__(self, data: Any):
          self.data = data
          self.next = None
          self.prev = None
  
  class DoubleLinkedList:
      """ A doubly linked list implementation that allows traversal in both directions.
      It supports appending elements to the end, prepending elements to the beginning,
      and reversing the list.
      >>> dll = DoubleLinkedList()
      >>> dll.append(1)
      >>> dll.append(2)
      >>> dll.prepend(0)
      >>> print(dll.head.prev)
      None
      >>> print(dll.head.data)
      0
      >>> print(dll.head.next.data)
      1
      >>> dll.reverse()
      >>> print(dll.head.data)
      2
      >>> print(dll.head.next.data)
      1
      """
      
      def __init__(self): 
          self.head = None
   
      def append(self, new_data: Any): 
          new_node = Node(new_data) 
          if self.head is None:
              self.head =  new_node
          else: 
              curr_node = self.head
              while curr_node.next != None:
                  curr_node = curr_node.next
              curr_node.next = new_node
              new_node.prev = curr_node
   
      def prepend(self, new_data: Any):
          new_node = Node(new_data) 
          if self.head is None: 
              self.head = new_node
              return
          new_node.next = self.head
          self.head.prev = new_node 
          self.head = new_node
  
      def reverse(self):
          curr_node = self.head
          while curr_node:
              temp = curr_node.next
              curr_node.next = curr_node.prev
              curr_node.prev = temp
              curr_node = curr_node.prev
          if temp:
              self.head = temp.prev
  
output:     
      def __init__(self): 
          self.head = None
   
      def append(self, new_data: Any): 
          new_node = Node(new_data) 
          if self.head is None:
              self.head =  new_node
          else: 
              curr_node = self.head
              while curr_node.next != None:
                  curr_node = curr_node.next
              curr_node.next = new_node
              new_node.prev = curr_node
   
      def prepend(self, new_data: Any):
          new_node = Node(new_data) 
          if self.head is None: 
              self.head = new_node
              return
          new_node.next = self.head
          self.head.prev = new_node 
          self.head = new_node
  
      def reverse(self):
          curr_node = self.head
          while curr_node:
              temp = curr_node.next
              curr_node.next = curr_node.prev
              curr_node.prev = temp
              curr_node = curr_node.prev
          if temp:
              self.head = temp.prev
  