docs: def del_node(self, name):
          '''
          API: del_node(self, name)
          Description:
          Removes node from Graph.
          Input:
              name: Name of the node.
          Pre:
              Graph should contain a node with this name.
          Post:
              self.neighbors, self.nodes and self.in_neighbors are updated.
          '''
          if name not in self.neighbors:
              raise Exception('Node %s does not exist!' %str(name))
          for n in self.neighbors[name]:
              del self.edge_attr[(name, n)]
              if self.graph_type == UNDIRECTED_GRAPH:
                  self.neighbors[n].remove(name)
              else:
                  self.in_neighbors[n].remove(name)
          if self.graph_type is DIRECTED_GRAPH:
              for n in self.in_neighbors[name]:
                  del self.edge_attr[(n, name)]
                  self.neighbors[n].remove(name)
          del self.neighbors[name]
          del self.in_neighbors[name]
          del self.nodes[name]