저는 현재 데이터 구조와 알고리즘을 배우고 있으며 연습 중 하나는 처음부터 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
를 사용하는 것보다 방법과 동일 귀하의 질문에. –
IDE에서 디버거를 사용하면 버그를 찾는 것보다 빠르게 버그를 찾는 데 도움이 될 것입니다. 디버거에 익숙하지 않다면, 사용법을 배우는 것이 좋습니다. 시간과 낭비되는 시간을 절약 해줍니다. –
[어떤 주제에 대해 질문 할 수 있습니까?] (http://stackoverflow.com/help/on-topic), [질문하는 방법] (http://stackoverflow.com/help/how-to- ask), [최소한의 완전하고 검증 가능한 예제를 만드는 법] (http://stackoverflow.com/help/mcve). ** SO는 무료 코딩, 디버깅 또는 과제 완료 서비스가 아닙니다. ** 자신의 문제를 해결하고 특정 질문을하기 위해 노력한 사실을 입증해야합니다. – jonaz