2016-12-14 4 views
0

Zur Zeit arbeite ich an einem DoublyLinkedList zu schaffen, die Endrekursion verwendet.InsertItem bei Index 0 - DoublyLinkedList

Ich habe es geschafft, alle vollständig außer meinem Einsatz Artikel Arbeits meine Methoden zu erhalten.

Es funktioniert für als 0 bei jedem Index anderen Einfügen Ich habe versucht, eine if-Anweisung zu schreiben, die mit diesem beschäftigt und mein Code noch läuft aber obwohl sie die noOfItems erhöht. Es fügt den Artikel nie meiner Liste hinzu.

Könnte das Problem mit meinem toString sein? Oder verpasse ich etwas in meinem Fall?

Das ist mein DLLNode Klasse:

public class DLLNode 
{ 
    private DLLNode previous; 
    public DLLNode next; 
    private String value; 

    public DLLNode(String value) 
    { 
     this.value = value; 
     this.previous = previous; 
     this.next = next; 
    } 

    public DLLNode(String value, DLLNode next, DLLNode previous) 
    { 
     this.value = value; 
     this.next = next; 
     this.previous = previous; 
    } 

    public String GetDataItem() 
    { 
    return value; 
    } 

    public void setDataItem() 
    { 
     this.value = value; 
    } 


    public DLLNode GetPreviousNode() 
    { 
    return previous; 
    } 

    public void setPrevious(DLLNode previous) 
    { 
     this.previous = previous; 
    } 


    public DLLNode GetNextNode() 
    { 
    return next; 
    } 

    public void setNextNode(DLLNode next) 
    { 
     this.next = next; 
    } 

    public void addItem(String value) { 
    if(this.next == null) { 
      DLLNode newNode = new DLLNode(value); 
      this.next = newNode; 
    } else { 
      this.next.addItem(value); 
    } 
} 


    public void InsertItemHelper(String value, int indexToInsert, int current, DLLNode currNode) 
    { 
     if (indexToInsert == 0) 
     { 
      DLLNode newNode = new DLLNode(value); 
      currNode.GetNextNode().setPrevious(newNode); 
     } 
     else if (current == indexToInsert-1) 
     { 
      DLLNode newNode = new DLLNode(value); 
      newNode.setNextNode(currNode.GetNextNode()); 
      currNode.setNextNode(newNode); 
      currNode.GetNextNode().setPrevious(newNode); 
      newNode.setPrevious(currNode);   
     } 
     else 
     { 
      InsertItemHelper(value, indexToInsert, current+1, currNode.GetNextNode()); 
     } 
    } 

    public void DeleteItemHelper(int indexToDelete, int current, DLLNode currNode) 
    { 
     if (current == indexToDelete-1) 
     { 
      currNode.setNextNode(currNode.GetNextNode().GetNextNode()); 
     } 
     else 
     { 
      DeleteItemHelper(indexToDelete, current+1, currNode.GetNextNode()); 
     } 
    } 

} 

Und das ist meine DoublyLinkedList Klasse:

public class DoublyLinkedList 
{ 
    private int noOfItems; 
    private DLLNode head; 
    private DLLNode tail; 
    // Default constructor 
    public DoublyLinkedList() 
    { 
    head = null; 
    tail = null; 
    this.noOfItems = 0; 

    } 

    public int GetNoOfItems() 
    { 
    return noOfItems; 
    } 

    public String GetItemByIndex(int index) 
    { 
    int count = 0; 
    while (count < index) 
    { 
     head = head.GetNextNode(); 
     count++; 
    } 
    return head.GetDataItem(); 

    } 

    public DLLNode GetNodeByIndex(int index) 
    { 
     int count = 0; 
    while (count < index) 
    { 
     head = head.GetNextNode(); 
     count++; 
    } 
    return head; 
    } 

    public void AddItem(String value) 
    { 
     if (head == null) 
     { 
      DLLNode newNode = new DLLNode(value); 
      head = newNode; 
      noOfItems++; 
     } 
     else 
     { 
     head.addItem(value); 
     noOfItems++; 
     } 
     } 



    public void InsertItem(int index, String value) 
    { 
     if (index > noOfItems) 
     { 
      AddItem(value); 
     } 
     else { 
     head.InsertItemHelper(value, index, 0, head); 
     noOfItems++; 
     } 


    } 

    public void DeleteItem(int index) 
    { 

      if (index ==0) 
      { 
       System.out.println("Out of Bounds"); 
      } 
      if (index > noOfItems) 
      { 
      System.out.println("Out of Bounds"); 
      } 
      if (head == null) 
      { 
       System.out.println("No Item to remove"); 
      } 
      else if (index == 1) 
      { 
       head = head.GetNextNode(); 
       noOfItems--; 
      } 
      else 
      { 
       head.DeleteItemHelper(index, 0, head); 
       noOfItems--; 
      } 

    } 

    public int getNoOfItems() 
    { 
     return this.noOfItems; 
    } 

    public boolean isEmpty() 
    { 
     return (head == null); 
    } 




    public String toString() 
    { 
    DLLNode currentNode = head; 
    StringBuilder sb = new StringBuilder(); 
    while (currentNode != null) { 
     sb.append(currentNode.GetDataItem()); 

     if (currentNode.GetNextNode() != null) 
     { 
      sb.append(","); 
     } 
     currentNode = currentNode.GetNextNode(); 
    } 
     return sb.toString(); 
    } 

} 

ich den folgenden Code in meinem Einsatz Artikel hinzugefügt haben:

if (index ==0) 
    { 
     DLLNode newNode = new DLLNode(value); 
     head.setNextNode(head); 
    // newNode.next= head.GetNextNode(); 
     head = newNode; 
     noOfItems++; 
    } 

Wenn Ich füge die auskommentierte Zeile ein Ich erhalte einen Fehler mit dem String Builder.

Mit der Linie kommentierte heraus es an der Position 0, in der verknüpften Liste fügt aber eine des Restes nicht hinzuzufügen. Es erhöht jedoch noOfItems korrekt.

Der folgende Fehler ist, was angezeigt wird:

Exception in thread "main" java.lang.OutOfMemoryError: Java Heap-Speicher bei java.util.Arrays.copyOf (Arrays.java:2367) auf Java. lang.AbstractStringBuilder.expandCapacity (AbstractStringBuilder.java:130) bei java.lang.AbstractStringBuilder.ensureCapacityInternal (AbstractStringBuilder.java:114) bei java.lang.AbstractStringBuilder.append (AbstractStringBuilder.java:415) bei java.lang. StringBuilder.append (StringBuilder.java:132) bei ads2.DoublyLinkedList.toString (DoublyLinkedList.java:155) bei Java .lang.String.valueOf (String.java:2847) bei java.lang.StringBuilder.append (StringBuilder.java:128) bei ads2.Main.printList (Main.java:62) bei ads2.Main.main (Main.java:38) Java Ergebnis: 1 BUILD ERFOLGREICH (Gesamtzeit: 1 Sekunde)

Wenn Sie weitere Details zu dem Fehler benötigen, lass es mich wissen.

+0

Zeigen Sie uns den vollständigen Fehler –

Antwort

0

Sie müssen den Kopf aktualisieren, wenn an Position 0

Hinzufügen Da Sie den Kopf nicht aktualisieren, der alte Kopf noch in der Liste Objekt verknüpft ist, und es ist nächstes() geben, was in der sein sollte, neue Liste Objektindex 1, so am Ende mit der gleichen Liste nach oben

enter image description here

Sie können dies bestätigen

list.getNodeByIndex(0) != list.getNodeByIndex(1).previousNode();

bestätigt 210
+0

Ich habe ein bisschen mehr zu meiner Frage am Ende der folgenden von Ihrer Hilfe hinzugefügt. Wenn Sie weiter helfen könnten, würden wir uns freuen. – benjano

+0

Hallo, ich habe es jetzt richtig funktioniert, danke für deine Hilfe. – benjano

Verwandte Themen