/**
   * DOCUMENT ME!
   *
   * @param node DOCUMENT ME!
   * @return DOCUMENT ME!
   */
  public final boolean nodeRemove(final int node) {
    final IntEnumerator edges = edgesAdjacent(node, true, true, true);

    if (edges == null) {
      return false;
    }

    m_stack.empty();

    while (edges.numRemaining() > 0) m_stack.push(edges.nextInt());

    while (m_stack.size() > 0) edgeRemove(m_stack.pop());

    final Node n = m_nodes.getNodeAtIndex(node);

    if (n.prevNode != null) {
      n.prevNode.nextNode = n.nextNode;
    } else {
      m_firstNode = n.nextNode;
    }

    if (n.nextNode != null) {
      n.nextNode.prevNode = n.prevNode;
    }

    m_nodes.setNodeAtIndex(null, node);
    n.prevNode = null;
    n.firstOutEdge = null;
    n.firstInEdge = null;
    m_nodeDepot.recycleNode(n);
    m_nodeCount--;

    return true;
  }
  /**
   * DOCUMENT ME!
   *
   * @return DOCUMENT ME!
   */
  public final int nodeCreate() {
    final Node n = m_nodeDepot.getNode();
    final int returnThis;

    if (n.nodeId < 0) {
      returnThis = (n.nodeId = ++m_maxNode);
    } else {
      returnThis = n.nodeId;
    }

    m_nodes.setNodeAtIndex(n, returnThis);
    m_nodeCount++;
    n.nextNode = m_firstNode;

    if (m_firstNode != null) {
      m_firstNode.prevNode = n;
    }

    m_firstNode = n;
    n.outDegree = 0;
    n.inDegree = 0;
    n.undDegree = 0;
    n.selfEdges = 0;

    return returnThis;
  }