2016-08-13 1 views
-1

私は現在データ構造とアルゴリズムを学習しており、演習の1つはDoublyLinkedListをゼロから実装することでした。残念ながら、"listDelete"操作を私のリストで実行しようとすると、私のコードはいくつかの整数値でうまく動作します。 23、45、100、5、15を削除しようとするとうまくいきます。リストからを削除しようとすると、Exceptionがあります。 2つの要素を比較しながら、あなたが使用する必要があるので、あなたは、ここで一般的なデータタイプ(項目)を使用しているDoubleLinkedListの実装で何が問題になっていますか?

import java.util.Iterator; 
import java.util.NoSuchElementException; 
import java.util.Random; 

/** 
* Created on 13-Aug-16. 
*/ 
public class DoublyLinkedList<Item> implements Iterable<Item>{ 
    private Node<Item> head ; 

    private class Node<Item>{ 
     private Item key; 
     private Node<Item> prev; 
     private Node<Item> next; 
    } 

    public Node<Item> listSearch(Item key) 
    { 
     Node<Item> currentNode = head ; 

     while (currentNode != null && currentNode.key != key) 
       currentNode = currentNode.next ; 

     return currentNode ; 
    } 

    public void listInsert(Item item) 
    { 
     Node<Item> newNode = new Node<>(); //create an object of incoming item 
     newNode.next = head ; 
     newNode.prev = null ; 
     newNode.key = item ; 

     if (head != null) 
      head.prev = newNode ; 

     head = newNode; 
    } 

    public void listDelete(Item item){ 
     Node<Item> nodeToDelete = listSearch(item); 

     if (nodeToDelete == null) 
      throw new NoSuchElementException("Cant find element"); 

     if(nodeToDelete.prev != null) 
      nodeToDelete.prev.next = nodeToDelete.next ; 
     else 
      head = nodeToDelete.next; 

     if (nodeToDelete.next != null) 
      nodeToDelete.next.prev = nodeToDelete.prev ; 
    } 

    public Iterator<Item> iterator(){ 
     return new DoublyLinkedListIterator(); 
    } 

    private class DoublyLinkedListIterator implements Iterator<Item>{ 
     private Node<Item> nextNode; 

     public DoublyLinkedListIterator(){ 
      nextNode = head; 
     } 

     public boolean hasNext(){ 
      return nextNode != null ; 
     } 

     public Item next(){ 
      if (!hasNext()) 
       throw new NoSuchElementException(); 

      Item key = nextNode.key; 

      nextNode = nextNode.next ; 

      return key; 
     } 

     public void remove(){ 
      throw new UnsupportedOperationException(); 
     } 
    } //end of Iterator class 

    public String toString(){ 
     StringBuilder sb = new StringBuilder(); 

     for(Item item : this) 
      sb.append(item + ", "); 

     return sb.toString(); 
    } 

    public static void main(String[] args) { 
     DoublyLinkedList<Integer> numbers = new DoublyLinkedList<>(); 

     Random random = new Random(); 

     numbers.listInsert(23); 
     for (int i=1; i <=5; i++) 
      numbers.listInsert(random.nextInt(100)); 
     numbers.listInsert(45); 
     numbers.listInsert(100); 
     numbers.listInsert(400); 
     numbers.listInsert(5); 

     for (int i=1; i <=10; i++) 
      numbers.listInsert(random.nextInt(100)); 
     numbers.listInsert(15); 

     System.out.println("Before"); 
     System.out.println("LIST: " + numbers); 

     System.out.println("Deleting......................"); 
     numbers.listDelete(100); //doesnot work for some set of integers 
     System.out.println("After"); 
     System.out.println("LIST: " + numbers); 
    } 
} //end of class 
+0

を使用するよりも、equalsメソッドをあなたの質問で。 –

+0

これは、IDEでデバッガを使用すると、SOの質問よりも速くバグを見つけるのに役立ちます。デバッガに精通していない場合は、使用方法を学ぶことを強く推奨します。時間を無駄にする時間を節約します。 –

+0

[よくある質問について](http://stackoverflow.com/help/on-topic)、[よくある質問](http://stackoverflow.com/help/how-to-尋ねる)、[最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)を参照してください。 ** SOは、無料のコーディング、デバッグ、または宿題の修了サービスではありません。**あなた自身の問題を解決し、特定の質問をするために何らかの努力をしたことを示す必要があります。 – jonaz

答えて

0

は、例外メッセージを含めてください、むしろ今後の参照(==)

public Node<Item> listSearch(Item key) 
    { 
     Node<Item> currentNode = head ; 
     while (currentNode != null && !currentNode.key.equals(key)) 
       currentNode = currentNode.next ; 
     return currentNode ; 
    } 
+0

ありがとう@Sandeep。あなたの答えはそれを修正しました。 – aig

関連する問題