private void PopStack(TNode v) {
     stack.Remove(v.stackNode);
     v.stackNode = null;
 }
 private void PushStack(TNode v) {
     v.stackNode = stack.AddLast(v);
 }
 private void RDFS(TNode u) {
     component.Add(u);
     PopStack(u);
     foreach (var v in u.inNeighbours) {
         if (v.stackNode != null) {
             RDFS(v);
         }
     }
 }
 private TNode CreateTNode(Node v) {
     TNode tv;
     if (!nodeMap.ContainsKey(v)) {
         tv = new TNode(v);
         nodeMap[v] = tv;
     } else {
         tv = nodeMap[v];
     }
     return tv;
 }
 private void DFS(TNode u) {
     u.visited = true;
     foreach (var v in u.outNeighbours) {
         if (!v.visited) {
             DFS(v);
         }
     }
     PushStack(u);
 }