2016-04-26 7 views
0

Ich versuche, eine 'Add (int n)' Methode zu erstellen, um einen Knoten zu einer knotenbasierten Liste hinzuzufügen. Die Liste ist sortiert, und ich möchte den Knoten an der richtigen Stelle hinzufügen, so dass er nach dem Hinzufügen des Knotens noch sortiert wird.C# Hinzufügen von Werten zu einer sortierten knotenbasierten Liste

Beispiel:

aktuelle Knotenliste Wert: 1 - 2 - 2 - 3 bis 5 Wert hinzuzufügen: 2 Ergebnis: 1 - 2 - 2 - 2 - 3 bis 5

i gemacht eine Klasse genannt: nodeList mein Code:

class NodeList 
    { 
     private int head; 
     private NodeList tail; 

     public NodeList(int head, NodeList tail) 
     { 
      this.head = head; 
      this.tail = tail; 
     } 

     public NodeList Add(int n) 
     { 
      NodeList nl = new NodeList(head, tail); 
      NodeList result = null; 
      if (nl.head > n) 
       result = new NodeList(n, nl); 
      else 
      { 
       //cant figure this part out 
      } 
      return result; 
     } 
    } 

einen Knoten hinzufügen, wenn ‚n‘ kleiner ist als das erste Element in der Knoten basierten Liste einfach war, um herauszufinden, aber ich kann nicht scheinen, nur um herauszufinden, wie auf Mach es, wenn es nicht der Fall ist.

zusätzliche Informationen:

die Liste kann Duplikate enthalten. Die Klasse NodeList kann nicht mehr Instanzvariablen haben als die, die ich einfügte.

+0

versuchen, eine Liste verwenden. Fügen Sie Werte hinzu und sortieren Sie sie, wenn der Benutzer Add (int n) aufruft. –

Antwort

1

Vorausgesetzt, dass Sie diese unveränderlich halten wollen und immer neue Instanz erstellen, kann anderer Teil dieses:

  nl.tail = nl.tail == null ? new NodeList(n, null) : nl.tail.Add(n); 
      return nl; 
+0

Er möchte, dass die Liste sortiert wird. – Linvi

+0

Liste würde sortiert werden. Wenn das Add am Ende aufgerufen würde, würde check rekursiv ausgeführt werden, um das richtige zu ersetzende Tail zu erreichen. –

+0

das funktioniert großartig und ist eigentlich genau das, was ich brauche, da es nicht sowohl eine private als auch eine öffentliche Methode haben muss, danke! – FrankK

1

Wenn Sie wirklich Ihre Struktur verwenden möchten, können Sie den folgenden Code verwenden. Es verwendet eine rekursive Funktion, um über die verschiedenen Elemente bis zum richtigen Knoten zu iterieren.

public class NodeList 
{ 
    public int Head { get; } 
    public NodeList Tail { get; set; } 

    public NodeList(int head, NodeList tail) 
    { 
     Head = head; 
     Tail = tail; 
    } 

    private NodeList Add(int value, NodeList current) 
    { 
     var nextNode = current.Tail; 

     if (nextNode == null) 
     { 
      current.Tail = new NodeList(value, null); 
      return current.Tail; 
     } 

     if (nextNode.Head > value) 
     { 
      current.Tail = new NodeList(value, nextNode); 
      return current.Tail; 
     } 

     // Recursive 
     return Add(value, nextNode); 
    } 

    public NodeList Add(int value) 
    { 
     if (value < this.Head) 
     { 
      var newRoot = new NodeList(value, this); 
      return newRoot; 
     } 

     Add(value, this); 
     return this; 
    } 
} 
+0

kann dies auch mit nur 1 Parameter in der Add-Methode getan werden? – FrankK

+0

Es gibt nur 1 Parameter für die öffentliche 'Add'-Methode. 'öffentliche NodeList Add (int Wert)' – Linvi

+0

Ist es das, was Sie wollten? – Linvi