Пытаясь улучшить свои алгоритмы, я пытался написать код DFS с O (V + 2E) сложностью по времени, но, похоже, я в итоге получил O (V ^ 2). Пожалуйста, помогите мне с исправлением кода. Я могу использовать рекурсивный процесс, переместив один из циклов while в подпрограмму. Это единственный способ исправить это, или мы можем сделать что-то еще, чтобы это исправить.
package com.dfs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Stack;
public class MainMethod {
/**
* @param args
*/
public static void main(String[] args) {
List<List<Integer>> nodesList = new ArrayList<List<Integer>>();
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
List<Integer> list3 = new ArrayList<>();
List<Integer> list4 = new ArrayList<>();
List<Integer> list5 = new ArrayList<>();
List<Integer> list6 = new ArrayList<>();
list1.add(1);
list1.add(2);
list2.add(3);
list2.add(2);
list3.add(3);
list4.add(4);
list5.add(5);
list5.add(1);
list5.add(0);
nodesList.add(list1);
nodesList.add(list2);
nodesList.add(list3);
nodesList.add(list4);
nodesList.add(list5);
nodesList.add(list6);
//List to check vertext has been visted or not
List<List<Integer>> vertexVisitCheck = new ArrayList();
Stack<List<Integer>> tobeExplored = new Stack<>();
System.out.println(nodesList);
int startnode = 0;
tobeExplored.push(nodesList.get(startnode));
System.out.println("Added to the Stack ===> "+nodesList.get(startnode));
while(!tobeExplored.isEmpty())
{
List<Integer> nextVertex = tobeExplored.peek();;
vertexVisitCheck.add(nextVertex);
Iterator<Integer> iterator = nextVertex.iterator();
int counter = nextVertex.size();
while (iterator.hasNext()) {
int check = iterator.next();
if(!vertexVisitCheck.contains(nodesList.get(check)))
{
tobeExplored.push(nodesList.get(check));
System.out.println("Added to the Stack ===> "+nodesList.get(check));
if(tobeExplored.peek().size()==0)
{
vertexVisitCheck.add(nodesList.get(check));
tobeExplored.pop();
}
break;
}
if(--counter==0)
{
vertexVisitCheck.add(nodesList.get(check));
tobeExplored.pop();
}
}
}
}
}