[RESOLVIDO] - Trocar um elemento por outro em uma lista

Bom dia, estou com um problema que creio que seja simples:

Possuo uma lista, e preciso criar um método que altere de posição o primeiro elemento com o segundo, mas não estou conseguindo entender a lógica para fazer isso.

Preciso criar o método na classe descrita abaixo, o método precisa ser public boolean fazerTroca()

Se alguém puder me dar uma luz…agradeço.

public class List {
   private Node firstNode;
   private Node lastNode;
   private String name;

   public List() { 
      this( "list" ); 
   }  

   public List( String listName ) {
      name = listName;
      firstNode = lastNode = null;
   }
   
  public Node getFirst(){
       return firstNode;
    }
   
   public Node getLast(){
	   return lastNode;
   }

   public  void insertAtFront( Object insertItem ) {
      if ( isEmpty() ) 
         firstNode = lastNode = new Node( insertItem );

      else 
         firstNode = new Node( insertItem, firstNode );
   }

   public  void insertAtBack( Object insertItem ) {
      if ( isEmpty() ) 
         firstNode = lastNode = new Node( insertItem );

      else {
         lastNode.setNext (new Node( insertItem ));
         lastNode = lastNode.getNext();
      }
   }

   public  Object removeFromFront() throws EmptyListException {
      if ( isEmpty() ) 
         throw new EmptyListException( name );

      Object removedItem = firstNode.getData(); 

      if ( firstNode == lastNode )
         firstNode = lastNode = null;
      else
         firstNode = firstNode.getNext();

      return removedItem;

   } 

   public  Object removeFromBack() throws EmptyListException {
      if ( isEmpty() ) 

      Object removedItem = lastNode.getData(); 

      if ( firstNode == lastNode )
         firstNode = lastNode = null;

      else { 
         Node current = firstNode;

         while ( current.getNext() != lastNode )
            current = current.getNext();
   
         lastNode = current; 
         current.setNext(null);
      }

      return removedItem; 

   } 

   public boolean isEmpty() { 
      return firstNode == null; // return true if List is empty
   }

   public  void print() {
      if ( isEmpty() ) {
         System.out.println( "Empty " + name );
         return;
      }

      System.out.print( "The " + name + " is: " );
      Node current = firstNode;

      while ( current != null ) {
         System.out.print( current.getData().toString() + " " );
         current = current.getNext();
      }

      System.out.println( "\n" );
   }
  
}

Pelo código imagino que seja um Lista Simplesmente Encadeada (Simply Linked List). Então os nodes só aponta para o próximo. Considerando isso um método que altera a posição do primeiro com o do segundo seria assim:

public boolean fazerTroca() {
    if(isEmpty()) {
        System.out.println("A lista está vazia");
        return false;
    }

    if (firstNode == null || firstNode.getNext() == null) {
        System.out.println("Quantidade de elementos insuficientes para esta operação");
        return false;
    }
    
                                                      // Exemplo Lista: { (10) -> (20) -> (30) }
    Node nodeTemporario = firstNode.getNext();        // o elemento '20'
    firstNode.setNext(firstNode.getNext().getNext()); // o próximo do '10' vira o '30'
    nodeTemporario.setNext(firstNode);                // o próximo do '20' vira o '10': (20) -> (10) -> (30)
    firstNode = nodeTemporario;                       // atualiza a variável pra apontar pro '20'

    return true;
}


Ah, saquei, cara.
E seguinte, isso eu considero alteração entre o primeiro e o segundo, caso precise ser feito alteração entre o terceiro e quarto, pela lógica eu precisaria por um contador, para que o programa contabilize a hora que ele chegar no elemento que eu espero…só que minha lógica não ta funcionando…

Seria algo do tipo:

public boolean troca_ter_quarto(){
	   if(isEmpty()){
	      System.out.println("A lista está vazia");
	      return false;
	   }
	   do{	      
	      int index = 0;
	      index++;	        
	      if(index == 3) {   
	         firstNode.setNext(firstNode.getNext().getNext().getNext());
	         nodeTemporario.setNext(firstNode);
	         firstNode = nodeTemporario;
	      }
	   } while (firstNode != null);
	   return true;
   }

Trocar o terceiro node pelo quarto node ficaria assim:

public boolean terceiroPorQuarto() {
    if(isEmpty()) {
        System.out.println("A lista está vazia");
        return false;
    }

    int contador = 0;
    int destino = 2; // eu quero chegar no TERCEIRO node
    
    Node terceiroNode = firstNode;  // tem que começar pelo primeiro
    Node antesDoTerceiro = null;    // pra poder trocar o NODE 3 com o NODE 4 preciso também do NODE 2

    while (contador != destino) {
        antesDoTerceiro = terceiroNode;
        terceiroNode = terceiroNode.getNext();

        if (terceiroNode == null) {
            System.out.println("Quantidade de elementos insuficientes para esta operação");
            return false;
        }

        contador++;
    }

    trocarDoisNodesConsecutivos(antesDoTerceiro, terceiroNode);

    return true;
}

private void trocarDoisNodesConsecutivos(Node anteriorEsquerda, Node esquerda) {
    if (anteriorEsquerda.getNext() != esquerda) {
        throw new InvalidParameterException("Este método só consegue trocar a posição de dois nodes consecutivos");
    }

                                                     // Exemplo:   '10' -> '20' -> '30' -> '40' -> '50'
    Node direita = esquerda.getNext();               // 'direita' é o quarto node '40'
    anteriorEsquerda.setNext(esquerda.getNext());    // o próximo do '20' vira o '40'
    esquerda.setNext(esquerda.getNext().getNext());  // o próximo do '30' vira o node '50'
    direita.setNext(esquerda);                       // o próximo do '40' vira '30'
                                                     // Resultado: '10' -> '20' -> '40' -> '30' -> '50'
}

Criei um método auxiliar trocarDoisNodesConsecutivos() pra melhorar a legibilidade do método principal.

Espero que tenha conseguido entender. Pode perguntar algo se tiver ficado com dúvida.

Cara, eu só não entendi por quê preciso começar com 2 aqui…
De resto eu compreendi tudo.

É 2 porque eu comecei contando do 0, que é o padrão em programação.
0 -> primeiro
1 -> segundo
2 -> terceiro

Mas se quiser poderia ter feito dessa forma e funciona do mesmo jeito:

    int contador = 1;
    int destino = 3; // eu quero chegar no TERCEIRO node

E outra coisa que não tem a ver com o algoritmo em si, mas que acho relevante comentar: troca_ter_quarto() é um nome um pouco estranho pra um nome de método no Java. O padrão é o formato Camel Case, como por exemplo: trocaTerQuatro().

Beleza, cara.
Consegui tirar todas as dúvidas.

Agradeço a atenção.