7
votes

Liste liée Inverser sans Temp

Y a-t-il un moyen d'inverser la liste liée sans utiliser la variable Temp dans C? Merci d'avance.

L'approche célèbre: xxx

utilise la variable TEMP

Saurabh


5 commentaires

Récursion est une triche car les paramètres sont essentiellement des variables temporaires.


D'accord, mais c'est généralement le genre de questions semi-stillantes comme celle-ci.


C'est le genre de quibning sémantique utilisé par les participants qui ne sont pas au courant de la vraie réponse. : P


Souhaitez-vous s'il vous plaît me dire la manière récursive.


Il y a quelques questions similaires à celles qui y sont déjà: Stackoverflow.com/Questtions/4078864/Reversing-linked-list < / a> et

4 Réponses :


3
votes

Utilisez XOR-Swaps sur les pointeurs pour simuler un liste liée XOR.

la mise en œuvre est laissée au lecteur comme un exercice.


0 commentaires

6
votes

Notez que votre utilisation TEMP génère réellement deux appels swap () et peut être remplacé par: xxx

vous pouvez Swap sans Temps à l'aide de Xor, il s'appelle XOR Swap .


0 commentaires

1
votes

Approche récursive:

   Element *revLinkListHead;
   reverse(head, &revLinkListHead);


0 commentaires

0
votes

Si quelqu'un est toujours intéressé, voici la solution qui n'utilise pas de nouvelles variables, à l'exception de ceux qui sont passés dans un appel récursif.

public static List invert(List l) {
    invert(l.next, l, l);
    l = l.next;
    breakCycle(l, l);
    return l;
}

private static void invert(List l, List toBeNext, List first) {
    if(l.next == null) {
        l.next = toBeNext;
        first.next = l;
    } else {
        invert(l.next, l, first);
        l.next = toBeNext;
    }
}

private static void breakCycle(List l, List first) {
    if(l.next == first) {
        l.next = null;
    } else {
        breakCycle(l.next, first);
    }
}


0 commentaires