2010-01-15 8 views

Répondre

0

Vous devez définir une structure de données de noeud contenant des données et une référence au noeud suivant dans la liste chaînée. Quelque chose comme:

class Node { 
    private Node _next; 
    private string _data; 

    public Node(string data) { 
    _next = null; 
    _data = data; 
    } 

    // TODO: Property accessors and functions to link up the list 
} 

Ensuite, vous pouvez écrire un algorithme à boucle sur la liste dans l'ordre inverse, la construction d'une nouvelle liste inversée.

+0

alternativement vous pouvez utiliser la liste chaînée intégrée mais utiliser seulement les liens dans une direction, vous devriez vérifier avec votre tuteur si cela est acceptable si –

+0

donc fondamentalement vous me dites que C# a réellement des pointeurs et ils sont déclarés avec un "_"? – BlackBear

+0

N ° C# utilise des références qui sont similaires aux pointeurs (mais pas identiques). Les références sont suffisantes pour implémenter une liste chaînée, vous n'avez pas besoin de pointeurs. BTW, C# ** fait ** ont des pointeurs, mais ils ne sont presque jamais nécessaires et ne sont pas recommandés pour une utilisation normale –

0
reversed_list = new 
for all node in the original list 
    insert the node to the head of reversed_list 
+0

Si je ne veux pas utiliser une nouvelle liste chaînée alors quel sera l'algorithme. –

+0

@Pritam, en fait, je n'ai utilisé aucune nouvelle liste. 'reverse_list' est juste un pointeur sur la tête de la nouvelle liste. En d'autres termes, aucun besoin de mémoire ne sera nécessaire. – pierrotlefou

+0

ce n'est pas efficace. – DarthVader

1

boucle d'utilisation (élément courant: currentNode, les variables initialzied en dehors boucle: previousNode, nextNode)

Set nextNode = currentNode.NextNode 
Set currentNode.NextNode = previousNode 
Set previousNode = currentNode 
Set currentNode = nextNode 
continue with loop 
0

Depuis cela devoirs probablement, je vais dire cela d'une manière qui pourrait être assez déroutant pour ne pas faire tout le travail. J'espère que ma tentative ne rendra pas les choses plus confuses (ce qui est hautement possible).

Lorsque vous avez une référence à un nœud dans la liste (disons le premier nœud), vous avez également une référence au nœud qui le suit. Vous avez juste besoin de faire référence au nœud suivant à votre nœud actuel tout en gardant suffisamment d'informations autour du nœud suivant (et de son état précédent) pour effectuer un travail similaire. Maintenant, les seules parties délicates concernent les conditions aux limites (le début et la fin de la liste).

2

Ici, il utilise la récursivité.

private void Reverse(Item item) 
    { 
     if (item == null || item.Next == null) //if head is null or we are at the tail 
     { 
      this.Head = item; //we are at the tail or empty list, set the new head to the tail 
      return; 
     } 

     Reverse(item.Next); 

     var nextItem = item.Next; //get the next item out, dealing with references don't want to override it 
     item.Next = null;   //once you get the next item out, you can delete the *reference* i.e. link to it 
     nextItem.Next = item;  //set the item you got out link to next item to the current item i.e. reverse it 
    } 
0
//Have tried the Iterative approach as below, feel free to comment/optimize 

package com.test; 


public class ReverseSinglyLinkedList { 


public ReverseSinglyLinkedList() { 
    // TODO Auto-generated constructor stub 
} 
public Node ReverseList(Node n) 
{ 

    Node head = n; 
    Node current = n; 
    Node firstNodeBeforeReverse = n; // keep track of origional FirstNode 

    while(true) 
    { 

     Node temp = current; 
     // keep track of currentHead in LinkedList "n", for continued access to unprocessed List 
     current = current.next; 
     temp.next = head; 
      // keep track of head of Reversed List that we will return post the processing is over 
     head = temp; 

     if(current.next == null) 
     { 

      temp = current; 
      current.next = head; 
      head = temp;   
          // Set the original FirstNode to NULL 
      firstNodeBeforeReverse.next = null; 

      break; 
     } 
    } 

    return head; 

} 

public void printLinkList(Node n) 
{ 

    while(true) 
    { 
     System.out.print(n.data + " "); 
     n = n.next; 
     if(n.next ==null) 
     { 
      System.out.print(n.data + " "); 
      break; 
     } 

    } 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    // TEST THE PROGRAM: crate a node List first to reverse it 
    Node n = new Node(1); 
    n.next = new Node(2); 
    n.next.next = new Node(3); 
    n.next.next.next = new Node(4); 
    n.next.next.next.next = new Node(5); 
    n.next.next.next.next.next = new Node(6); 

    ReverseSinglyLinkedList r = new ReverseSinglyLinkedList(); 
    System.out.println("Input Linked List : "); 
    r.printLinkList(n); 

    Node rsList = r.ReverseList(n); 

    System.out.println("\n Reversed Linked List : "); 
    r.printLinkList(rsList); 



} 

} 
0

est lié ici inversion itérative et récursive en .net (C#) (notez la liste chaînée est maintenant à la fois premier et dernier pointeurs afin que je puisse ajouter à la fin ou insérer à la tête dans O . (1) - on n'a pas à faire ce que je viens de définir mon comportement de liste chaînée comme ci-dessus)

public void ReverseIterative() 
     { 
      if(null == first) 
      { 
       return; 
      } 
      if(null == first.Next) 
      { 
       return; 
      } 
      LinkedListNode<T> p = null, f = first, n = null; 
      while(f != null) 
      { 
       n = f.Next; 
       f.Next = p; 
       p = f; 
       f = n; 
      } 
      last = first; 
      first = p; 
     } 

récursive:

 public void ReverseRecursive() 
     { 
      if (null == first) 
      { 
       return; 
      } 
      if (null == first.Next) 
      { 
       return; 
      } 
      last = first; 
      first = this.ReverseRecursive(first); 
     } 
     private LinkedListNode<T> ReverseRecursive(LinkedListNode<T> node) 
     { 
      Debug.Assert(node != null); 
      var adjNode = node.Next; 
      if (adjNode == null) 
      { 
       return node; 
      } 
      var rf = this.ReverseRecursive(adjNode); 
      adjNode.Next = node; 
      node.Next = null; 
      return rf; 
     }