Eu tenho trabalhado em um projeto Java para uma classe há algum tempo. É uma implementação de uma lista encadeada (aqui chamada AddressList
, contendo nós simples chamados ListNode
). O problema é que tudo teria que ser feito com algoritmos recursivos. Consegui fazer tudo bem sem um método:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
No momento, minha reverse
função apenas chama uma função auxiliar que recebe um argumento para permitir a recursão.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
Com a minha função auxiliar tendo a assinatura de private ListNode reverse(ListNode current)
.
No momento, ele está funcionando iterativamente usando uma pilha, mas não é isso que a especificação exige. Eu tinha encontrado um algoritmo em C que o revertia recursivamente e o convertia manualmente em código Java, e funcionava, mas não o entendia.
Edit: Deixa pra lá, eu descobri entretanto.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Enquanto estou aqui, alguém vê algum problema com esta rota?
fonte
Respostas:
Há um código em uma resposta que explica tudo, mas você pode achar mais fácil começar de baixo para cima, perguntando e respondendo a pequenas perguntas (essa é a abordagem em The Little Lisper):
fonte
Essa pergunta me foi feita em uma entrevista e fiquei aborrecido por ter me atrapalhado, já que estava um pouco nervoso.
Isso deve reverter uma lista unida individualmente, chamada com reverse (head, NULL); então, se esta fosse sua lista:
editar: eu fiz 6 edições nisso, mostrando que ainda é um pouco complicado para mim lol
fonte
Cheguei no meio do caminho (até nulo e um nó, conforme sugerido pelo plinto), mas perdi o controle após fazer uma chamada recursiva. No entanto, depois de ler o post por plinto, aqui está o que eu descobri:
fonte
Aqui está outra solução recursiva. Ele tem menos código na função recursiva do que alguns dos outros, então pode ser um pouco mais rápido. Isso é C #, mas acredito que Java seria muito semelhante.
fonte
O algo precisará funcionar no modelo a seguir,
Estrutura:
Código:
Resultado:
fonte
Acho que esta é uma solução mais limpa, que se assemelha ao LISP
fonte
Eu sei que este é um post antigo, mas a maioria das respostas não são recursivas na cauda, ou seja, elas fazem algumas operações após retornar da chamada recursiva e, portanto, não são as mais eficientes.
Aqui está uma versão recursiva da cauda:
Ligue com:
fonte
fonte
fonte
fonte
fonte
Reverse por algo recursivo.
Por iterativo
fonte
Esta solução demonstra que nenhum argumento é necessário.
Aqui está o código de suporte, para demonstrar que isso funciona:
fonte
Aqui está uma abordagem iterativa simples:
E aqui está uma abordagem recursiva:
fonte
Como Java é sempre passado por valor, para reverter recursivamente uma lista vinculada em Java, certifique-se de retornar a "nova cabeça" (o nó principal após a reversão) no final da recursão.
fonte
PointZeroTwo tem uma resposta elegante e a mesma em Java ...
fonte
fonte
chamada usando: head = reverseRec (null, head);
fonte
O que os outros caras fizeram, em outro post é um jogo de conteúdo, o que eu fiz é um jogo de linkedlist, reverter o membro do LinkedList não reverter de um Value of members.
fonte
fonte
A solução é:
}
fonte
fonte
fonte
fonte
fonte
Inspirado por um artigo que discute implementações imutáveis de estruturas de dados recursivas, coloquei uma solução alternativa em conjunto usando Swift.
A solução líder em documentos de resposta, destacando os seguintes tópicos:
Eu indiquei isso quando aplicável na solução abaixo.
fonte
Reverter a lista vinculada usando recursão. A ideia é ajustar os links invertendo os links.
fonte
fonte
fonte
Aqui está uma referência se alguém estiver procurando por uma implementação Scala:
fonte