2016-06-16 9 views
0

私はLinkedListと同様にDataStructureという2つのクラスを持っています。私のDataStructureクラスは、リンクリストの挿入/削除/置換/更新/表示を行います。インデックス付き要素の前にリンクリスト内の要素を挿入する際に問題があります。コードをデバッグしてLinkedListクラスを見ると、リンクが途切れていて連続していないことがわかります。私はすべてが論理的に見えるので、コードの何が間違っているのか分かりません。誰かがこれを見て正しい方向に私を導くことができれば、私は大いに感謝しています。インデックスの前に単独リンクされたリストの挿入

これは、プロジェクト全体の唯一の抜粋ですので、タイプを変更すること自由に感じ

データ構造クラス:

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クラス

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

尾の追跡は何ですか? 「索引要素」とはどういう意味ですか? – CrazyJavaLearner

+0

@Dharani tailがリストの最後の要素を追跡しています。私はたぶん「索引要素」を誤って表現していました。リンクされたリストの特定のインデックスにある要素。 –

答えて

0

私がいることを観察しています何がLinkedListクラスのAdd()メソッドの問題です。以下は修正版です:一度試してみてください。 もう1つ、Move(int index)メソッドでループは(index -1)回実行する必要があります。そうしないと、前のリンクをリンクできなくなります。問題がまだ解決されていない場合

だから、修正方法を下記一度試してみて、私に教えてください:

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

ありがとうございます。私は過去2日間このことに固執してきました! –

+0

あなたはようこそ...ハッピーコーディング... :) – pbajpai21

関連する問題