2016-08-13 4 views
-1

저는 현재 데이터 구조와 알고리즘을 배우고 있으며 연습 중 하나는 처음부터 DoublyLinkedList를 구현하는 것입니다. 불행히도 "listDelete" 작업을 내 목록에서 수행하려고하면 내 코드가 일부 정수 값에는 적합하지만 일부 값에는 적합하지 않습니다. 23, 45, 100, 5, 15을 삭제하려고하면 문제가 없습니다. 목록에서 을 삭제하려고하면 Exception이 있습니다. 두 요소를 비교하면서 사용한다, 그래서 당신은 여기에 일반 데이터 유형 (항목)를 사용하는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

를 사용하는 것보다 방법과 동일 귀하의 질문에. –

+0

IDE에서 디버거를 사용하면 버그를 찾는 것보다 빠르게 버그를 찾는 데 도움이 될 것입니다. 디버거에 익숙하지 않다면, 사용법을 배우는 것이 좋습니다. 시간과 낭비되는 시간을 절약 해줍니다. –

+0

[어떤 주제에 대해 질문 할 수 있습니까?] (http://stackoverflow.com/help/on-topic), [질문하는 방법] (http://stackoverflow.com/help/how-to- ask), [최소한의 완전하고 검증 가능한 예제를 만드는 법] (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

Thanks @Sandeep. 당신의 대답이 그것을 고쳤습니다. – aig

관련 문제