// links y under x
 private void link(FibonacciHeapNode y, FibonacciHeapNode x) {
   removeFromSiblings(y);
   y.parent = x;
   if (x.child == null) x.child = y;
   else concatenateSiblings(x.child, y);
   x.degree++;
   y.mark = false;
 }
 private void cascadingCut(FibonacciHeapNode y) {
   FibonacciHeapNode z = y.parent;
   if (z != null) {
     if (!y.mark) {
       y.mark = true;
     } else {
       cut(y, z);
       cascadingCut(z);
     }
   }
 }
  // cut node x from below y
  private void cut(FibonacciHeapNode x, FibonacciHeapNode y) {
    // remove x from y's children
    if (y.child == x) y.child = x.nextSibling;
    if (y.child == x) y.child = null;

    y.degree--;
    removeFromSiblings(x);
    concatenateSiblings(x, min);
    x.parent = null;
    x.mark = false;
  }