title: Python Doubly Linked List Node Removal
body: <p>I created a basic doubly linked list class in Python, and it has three methods: append, remove, and show. I fully understand the append method, and I fully understand the show method. However, I am mildly confused about the way my remove method works.</p>
  
  <p>These are my two classes - my Node class and my Doubly Linked List class:</p>
  
  <pre><code>class ListNode:
      def __init__(self, data, prev, next):
          self.data = data
          self.prev = prev
          self.next = next
  
  class DoubleList(object):
      head = None
      tail = None
  
      def append(self, data):
          new_node = ListNode(data, None, None)
          if self.head is None:
              self.head = self.tail = new_node
          else:
              new_node.prev = self.tail
              new_node.next = None
              self.tail.next = new_node
              self.tail = new_node
  
      def remove(self, node_value):
          current_node = self.head
          while current_node is not None:
              if current_node.data == node_value:
                  if current_node.prev is not None:                   
                      current_node.prev.next = current_node.next
                      current_node.next.prev = current_node.prev
                  else:
                      self.head = current_node.next
                      current_node.next.prev = None
              current_node = current_node.next
      def show(self):
  
          print("Show list data:")
          current_node = self.head
          while current_node is not None:
              print(current_node.prev.data if hasattr(current_node.prev, "data") else None,)
              print(current_node.data)
              print(current_node.next.data if hasattr(current_node.next, "data") else None)
              current_node = current_node.next
          print("*"*50)
  </code></pre>
  
  <p>So, when I use my remove method that is part of my DoubleList class, the element is removed from the list as expected. However, the Node instance is also gone, and I verified this by using this bit of code before and after removing two nodes.</p>
  
  <pre><code>import gc
  for obj in gc.get_objects():
      if isinstance(obj, ListNode):
          print(obj.data)
  </code></pre>
  
  <p>Now, I assume I simply don't understand exactly what my remove method is doing. </p>
  
  <p>My understanding is this: </p>
  
  <p>I thought that the node would still exist, as the remove method only reassigns the previous nodes next attribute and the following nodes previous attribute. However, the current node is not altered, and it still holds references to the nodes that were next to it in the list.</p>
  
  <p>Obviously, my understanding is wrong, and I want to know why.</p>
  
  <p>Why does the instance of a Node I removed from my linked list disappear?</p>