2010-08-13 5 views
0

Depuis longtemps, je n'ai pas utilisé C ou C++, alors oubliez complètement les pointeurs. Je connais C# et en ai écrit une version de base. Besoin de savoir si je fais bien/mal?Échange de nœuds sur une seule liste chaînée

entrée: liste chaînée a-> b-> c-> d-> e> null

sortie: liste chaînée b-> a-> d-> c-> e> null

Nous devons écrire le code de sorte que la position de la mémoire soit permutée et non la valeur du nœud.

public void SwapLinkedList(LinkedList<int> LL) 
    { 
     LinkedListNode<int> current = LL.First; 
     while (current.Next != null) 
     { 
      int temp = current.Next.Value; 
      current.Next.Value = current.Value; 
      current.Value = temp; 
      current = current.Next.Next; 
     } 
    } 
+0

Définissez «swap». Ce code place la première valeur de liste à la fin correctement, est-ce ce que vous voulez faire? –

+0

Jetez un oeil à ce fil http://stackoverflow.com/questions/1535988/swapping-nodes-on-a-single-linked-list – Alam

Répondre

4

L'ordre LinkedListNode dans un LinkedList ne peut être modifiée cause de l'LinkedListNode permet seulement obtenir sur les Previous et Next propriétés. Donc, pour changer la commande dans un LinkedList vous pouvez seulement permuter les valeurs (qui permettent un ensemble).

Donc, pour que cela fonctionne, je voudrais utiliser des méthodes d'extension comme celles-ci pour faire l'échange un peu plus générale:

public static class LinkedListExtensions 
{ 
    public static LinkedList<T> SwapPairwise<T>(this LinkedList<T> source) 
    { 
     if (source == null) 
      throw new ArgumentNullException("source"); 

     var current = source.First; 

     if (current == null) 
      return source; 

     while (current.Next != null) 
     { 
      current.SwapWith(current.Next); 
      current = current.Next; 

      if (current != null) 
       current = current.Next; 
     } 

     return source; 
    } 

    public static void SwapWith<T>(this LinkedListNode<T> first, LinkedListNode<T> second) 
    { 
     if (first == null) 
      throw new ArgumentNullException("first"); 

     if (second == null) 
      throw new ArgumentNullException("second"); 

     var tmp = first.Value; 
     first.Value = second.Value; 
     second.Value = tmp; 
    } 
} 
0

Si vous avez référence LinkedListNode préférions supprimer et ajouter:

public static LinkedListNode<T> SwapWith<T>(LinkedListNode<T> first, LinkedListNode<T> second) 
{ 
     first.List.Remove(first); 
     second.List.AddAfter(second, first); 
     return second; 
} 
Questions connexes