2010-04-15 4 views
0

Linked-List: MiroirCréer une liste chaînée miroir en Java

Considérez la classe privée suivante pour un nœud d'une liste simplement chaînée d'entiers:

private class Node{ 
public int value; 
public Node next; 
} 

Un wrapper de classe, appelée, ListImpl, contient un pointeur, appelé start au premier noeud d'une liste chaînée de Noeud .

Ecrire une instance méthode pour ListImpl avec la signature:

public void mirror(); 

Cela fait une copie inversée de la liste chaînée pointée par début et qui copient ajouter ses à la fin de la liste. Ainsi, par exemple la liste:

début 1 2 3

après un appel à miroir, devient:

début 1 2 3 3 2 1

Remarque: dans votre réponse que vous ne faites pas besoin de dene le reste de la classe pour ListImpl juste la méthode miroir.

+0

Cela ressemble à HW. Jusqu'où avez-vous essayé? – codaddict

+0

Cela ressemble énormément aux devoirs. Qu'avez-vous fait jusqu'à présent? – zombat

Répondre

1

Quelle est votre question? Cela ressemble à un problème d'exercice. Êtes-vous à la recherche d'une solution optimisée? Une façon serait d'itérer juste au-dessus de la liste et d'ajouter des éléments à une pile pour finalement les ajouter en tant que nœuds après l'itération.

+0

Cela ressemble à une solution n^2 - parcourir la liste et ajouter à une pile, puis itérer sur la pile? Que diriez-vous juste de construire une liste liée pendant que vous itérez, puis attachez la tête de 3-2-1 à la queue de 1-2-3. –

+0

@Shakedown: Cela ne me semble pas une solution n^2. L'itération sur la liste prend un temps linéaire. Pour chaque nœud de la liste, sa valeur est transmise à la pile en temps constant. Le temps requis pour construire la pile complète est par conséquent linéaire. La suppression de toutes les valeurs de la pile prend un temps linéaire. Pour chaque valeur, l'ajouter à la fin de la liste peut être fait en temps constant. Le temps nécessaire pour ajouter les nouveaux nœuds à la liste est par conséquent linéaire. Par conséquent, l'ensemble de l'opération est linéaire. –

+0

@Aeth: Oui vous avez raison - mon erreur! –

0

Vous pouvez utiliser cette approche:

Algorithm findLinkedListMirror 
    If list does not exist 
    return 

    Let start and end be pointers to type Node 
    Position start to the first node of the list 
    Position end to last node of the list 

    While(start != end.next) 
    Add a new node next to end with value start.data 
    start = start.next 
    End While 

End 
+0

Le pointeur de positionnement vers le dernier nœud nécessiterait de toute façon une itération car c'est une liste chaînée unique – Fazal

2
public void mirror() { 
    if (start != null) { 
     Node prev = null; 
     Node p = start; 
     Node q = null; 
     while (p != null) { 
      Node n = new Node(); 
      n.value = p.value; 
      n.next = q; 
      q = n; 
      prev = p; 
      p = p.next; 
     } 
     prev.next = q; 
    } 
} 
+0

Est-ce que 'n.next = q; q = n; 'créer un noeud auto-lié? –

+0

Non. Il relie simplement le nouveau noeud au précédent –

1

Depuis Maurice a fourni un looping solution, je fournirai une solution récursive.

void mirror() 
{ 
    if (start == null) return; 
    mirrorSublist(start); 
} 

// returns the last node of the mirrored sublist 
Node mirrorSublist(Node firstOfSublist) 
{ 
    Node lastOfSublist = new Node(); 
    lastOfSublist.value = firstOfSublist.value; 
    lastOfSublist.next = null; 
    if (firstOfSublist.next == null) 
    { 
     firstOfSublist.next = lastOfSublist; 
    } 
    else 
    { 
     Node secondToLastOfSublist = mirrorSublist(firstOfSublist.next); 
     secondToLastOfSublist.next = lastOfSublist; 
    } 
    return lastOfSublist; 
} 
Questions connexes