2016-06-16 9 views
0

Ich habe zwei Klassen, DataStructure sowie LinkedList. Meine DataStructure-Klasse ist für das Einfügen/Löschen/Ersetzen/Aktualisieren/Anzeigen der verknüpften Liste verantwortlich. Ich habe Probleme mit dem Einfügen eines Elements in die verknüpfte Liste vor dem indizierten Element. Wenn ich den Code debugge und die LinkedList-Klasse anschaue, ist es offensichtlich, dass die Verbindung unterbrochen und nicht kontinuierlich ist. Ich bin mir nicht sicher, was im Code falsch ist, da alles logisch klingt. Wenn sich jemand das ansehen und mich in die richtige Richtung lenken könnte, würde ich es sehr schätzen. DieseSinglelinked List Insertion vor Index

ist nur ein Ausschnitt des gesamten Projekts, so fühlen sich frei, um die Art zu ändern

Datastructure Klasse:

public class DataStructure { 
    //Item LinkedList field 
    private LinkedList<Item> itemLinkedList; 

    //Constructor 
    public DataStructure() { 
     itemLinkedList = new LinkedList<>(); 
    } 

    //Add Item 
    public boolean addItem(Item item) { 
     boolean returnVal = false; 
     if (item != null) { 
      itemLinkedList.Move(2); 
      itemLinkedList.Add(item); 
      returnVal = true; 
     } 
     return returnVal; 
    } 
} 

LinkedList Klasse

public class LinkedList<T> { 
    //Fields 
    private Node<T> Head; 
    private Node<T> Current; 
    private Node<T> Tail; 
    private int size; 

    //Constructor 
    public LinkedList() { 

    } 

    //Methods 
    private void AddHead(T data) { 
     Node<T> temp = new Node<>(data); 
     Tail = Current = Head = temp; 
    } 

    public void Add(T data) { 
     if (data == null) throw new NullPointerException(); 
     else { 
      Node<T> temp = new Node<>(data); 
      if (Head == null) AddHead(data); 
      else { 
       if (Current == Tail) { 
        Tail.setNext(temp); 
        Current = Tail = temp; 
       } else if (Current == Head) { 
        temp.setNext(Head); 
        Current = Head = temp; 
       } else { 
        Node<T> cu = Current; 
        Current = temp; 
        Current.setNext(cu); 
       } 
      } 
      size++; 
     } 
    } 

    public Node MoveNext() { 
     if (Current.getNext() != null) 
      return Current = Current.Next; 
     else return Current; 
    } 

    public void MoveLast() { 
     if (Tail != null) 
      Current = Tail; 
    } 

    public void MoveFirst() { 
     if (Head != null) 
      Current = Head; 

    } 

    public void Move(int index) { 
     if (index >= size) MoveLast(); 
     else { 
      MoveFirst(); 
      for (int i = 0; i < index; i++) MoveNext(); 
     } 
    } 

    class Node<T> { 
     private T data; 
     private Node<T> Next; 

     public Node(T data, Node<T> next) { 
      this.data = data; 
      this.Next = next; 
     } 

     public Node(T data) { 
      this.data = data; 
     } 

     public T getData() { 
      return data; 
     } 

     public void setData(T data) { 
      this.data = data; 
     } 

     public Node<T> getNext() { 
      return Next; 
     } 

     public void setNext(Node<T> next) { 
      Next = next; 
     } 

     public boolean hasNext() { 
      return Next != null; 
     } 
    } 
} 
+0

Was Schwanz-Tracking ist? Was meinst du mit "indexiertes Element"? – CrazyJavaLearner

+0

@Dharani Schwanz verfolgt das letzte Element in der Liste. Ich habe das "indizierte Element" wahrscheinlich falsch formuliert. Das Element am spezifischen Index der verknüpften Liste. –

Antwort

0

Was ich beobachtet, dass es ist ein Problem in der Add() - Methode in der LinkedList-Klasse. Unten ist die modifizierte Version: Bitte versuchen Sie es einmal. Noch eine Sache, in der Methode Move (int index) sollte die Schleife für (Index -1) mal laufen, sonst können Sie die vorherige Verbindung nicht verknüpfen.

Also bitte versuchen Sie es einmal unter veränderten Methoden und mir sagen, ob das Problem noch nicht behoben ist:

public void Move(int index) { 
     if (index >= size) MoveLast(); 
     else { 
      MoveFirst(); 
      for (int i = 0; i < index-1; i++) MoveNext(); //Run loop until (index - 1) so that you can have reference at the node no. 2 (in case of index 2) 
     } 
    } 

public void Add(T data) { 
     if (data == null) throw new NullPointerException(); 
     else { 
      Node<T> temp = new Node<>(data); 
      if (Head == null) AddHead(data); 
      else { 
       if (Current == Tail) { 
        Tail.setNext(temp); 
        Current = Tail = temp; 
       } else if (Current == Head) { 
        temp.setNext(Head); 
        Current = Head = temp; 
       } else { 
        Node<T> cu = Current.getNext(); 
        Current.setNext(temp); 
        temp.setNext(cu); 
        Current = cu; //Recently added node 
       } 
      } 
      size++; 
     } 
    } 
+0

Danke. Ich war die letzten zwei Tage dran! –

+0

Sie sind herzlich willkommen ... Happy Coding ... :) – pbajpai21