I am trying to build an NFA with a special purpose of searching, which is totally different from regex. The State has following format
class State implements List{
//GLOBAL DATA
static int depth;
//STATE VALUES
String stateName;
ArrayList<String> label = new ArrayList<>(); //Label for states
//LINKS TO OTHER STATES
boolean finalState;
ArrayList<State> nextState ; // Link with multiple next states
State preState;             // previous state
public State()
{
    stateName = "";
    finalState = true;
    nextState = new ArrayList<>();
}
public void addlabel(String lbl)
{
    if(!this.label.contains(lbl))
        this.label.add(lbl);
}
public State(String state, String lbl)
{
    this.stateName = state;
    if(!this.label.contains(lbl))
       this.label.add(lbl);
    depth++;
}
public State(String state, String lbl, boolean fstate)
{
    this.stateName = state;
    this.label.add(lbl);
    this.finalState = fstate;
    this.nextState = new ArrayList<>();
}
void displayState()
{
    System.out.print(this.stateName+" --> ");
    for(Iterator<String> it = label.iterator(); it.hasNext();)
    {
        System.out.print(it.next()+" , ");
    }
    System.out.println("\nNo of States : "+State.depth);
}
Next, the NFA class is 
public class NFA
{
static final String[] STATES= {"A","B","C","D","E","F","G","H","I","J","K","L","M"
                            ,"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
State startState;
State currentState;
static int level;
public NFA()
{
    startState = new State();
    startState = null;
    currentState = new State();
    currentState = null;
    startState = currentState;
}
/**
 *
 * @param st
 */
NFA(State startstate)
{
    startState = new State();
    startState = startstate;
    currentState = new State();
    currentState = null;
    currentState = startState ; // To show that their is only one element in NFA
}
boolean insertState(State newState)
{
    newState.nextState = new ArrayList<>();
    if(currentState == null && startState == null ) //if empty NFA
    {
        newState.preState = null;
        startState = newState;
        currentState = newState;
        State.depth = 0;
        return true;
    }
    else 
    {
        if(!Exist(newState.stateName))//Exist is used to check for duplicates
        {
                newState.preState = currentState ;
                currentState.nextState.add(newState);
                currentState = newState;
                State.depth++;
                return true;
        }
    }
    return false;
}
boolean insertState(State newState, String label)
{
        newState.label.add(label);
        newState.nextState = null;
        newState.preState = null;
    if(currentState == null && startState == null)
    {
        startState = newState;
        currentState = newState;
        State.depth = 0;
       return true; 
    }
    else 
    {
        if(!Exist(newState.stateName))
        {
                newState.preState = currentState;
                currentState.nextState.add(newState);
                currentState = newState;
                State.depth++;
                return true;
        }
        else
        {
            ///code goes here
        }
    }
    return false;
}
void markFinal(State s)
{
    s.finalState = true;
}
void unmarkFinal(State s)
{
    s.finalState = false;
}
boolean Exist(String s)
{
    State temp = startState;
    if(startState.stateName.equals(s))
        return true;
    Iterator<State> it = temp.nextState.iterator();
    while(it.hasNext())
    {
        Iterator<State> i  = it ;//startState.nextState.iterator();
           {
            while(i.hasNext())
            {
                if(i.next().stateName.equals(s))
                    return true;
            }
        }
        //else
          //  return false;
    }
    return false;
}
void displayNfa()
{
    State st = startState;
    if(startState == null && currentState == null)
    {
        System.out.println("The NFA is empty");
    }
    else
    {
        while(st != null)
        {
            if(!st.nextState.isEmpty())
            {
                Iterator<State> it = st.nextState.iterator();
                do
                {
                    st.displayState();
                    st = it.next();
                }while(it.hasNext());
            }
            else
            {
                st = null;
            }
        }
    }
    System.out.println();
}
/**
 * @param args the command line arguments
 */
/**
 *
 * @param args the command line arguments
 */
public static void main(String[] args) 
{
    // TODO code application logic here
    NFA l = new NFA();
    State s = new State("A11", "a",false);
    NFA ll = new NFA(s);
    s = new State("A111", "a",false);
    ll.insertState(s);
    ll.insertState(new State("A1","0"));
    ll.insertState(new State("A1111","0"));
    ll.displayNfa();
    int j = 1;
    for(int i = 0 ; i < 2 ; i++)
    {
        int rand = (int) (Math.random()* 10);
        State st = new State(STATES[rand],String.valueOf(i), false);
        if(l.insertState(st))
        {
            System.out.println(j+" : " + STATES[rand]+" and "+String.valueOf(i)+ " inserted");
            j++;
        }
    }
        l.displayNfa();
        System.out.println("No of states inserted : "+ j--);
}
I want to do the following 
This program always skip to display the last state i.e. if there are 10 states inserted, it will display only 9.
In exist() method , i used two iterator but i do not know why it is working
I have no idea how to perform searching for the existing class name, when dealing with iterators.
How should i keep track of current State, properly iterate through the nextState List, Label List in a depth first order.
How to insert unique States i.e. if State "A" is inserted once, it should not insert it again (The exist method is not working)
Best Regards