public ArrayList<ISuggestionWrapper> addCharacter() {
        ArrayList<ISuggestionWrapper> suggestions = new ArrayList<ISuggestionWrapper>();
        initiateFromExhaustedNodes();
        Link nextLink = getNextLink();
        currentNodeVisitations = 1;
        while(neededSuggestions - suggestions.size() > 0 && nextLink != null){
            FastActiveNode currentNode = nextLink.UseLink(linkQueue);
            if(currentNode.isNew()){
                currentNodeVisitations++;
            }
            if(currentNode.isExhausted()){
                double thresholdRank = 0;
                Link thresholdLink = linkQueue.peek();
                if(thresholdLink != null){
                    thresholdRank = thresholdLink.getRank();
                }

                currentNode.getSuggestions(
                        suggestions,
                        neededSuggestions - suggestions.size(),
                        thresholdRank);
                SuggestionLink suggestionLink = currentNode.getSuggestionLink();
                if(suggestionLink != null){
                    linkQueue.add(suggestionLink);
                }

                if(!exhaustedNodes.contains(currentNode)){
                    exhaustedNodes.add(currentNode);
                }
            }
            else{
                currentNode.extractLinks(linkQueue);
            }

            if(suggestions.size() >= neededSuggestions){
                break;
            }

            nextLink = getNextLink();
        }

        totalNodeVisitations += currentNodeVisitations;
        //System.out.println("Done in " + currentNodeVisitations);
        return suggestions;
    }