2017-12-01 10 views
-4

주어진 색인에서 노드를 삽입 및 제거 할 수 없습니다.제네릭을 사용하는 이중 연결 목록 구현

문제는 인서트를 한 위치에 놓고 제자리에서 제거하십시오.

I가 중간에있는 요소를 삽입 할 경우 세 가지 요소가 있다면

, 그것은 을 삽입하지만 널로 인쇄되어 삽입 된 노드 이후이었다. 나는 어디서 잘못 됐어.

다음

내 코드는,

public class DoublyLinkedList<E> { 
    private static class Node<E> { 
     private E element; 
     private Node<E> prev; 
     private Node<E> next; 

     public Node(E e, Node<E> p, Node<E> n) { 
      this.element = e; 
      this.prev = p; 
      this.next = n; 
     } 

     public E getElement() { 
      return this.element; 
     } 

     public Node<E> getPrev() { 
      return this.prev; 
     } 

     public Node<E> getNext() { 
      return this.next; 
     } 

     public void setPrev(Node<E> p) { 
      prev = p; 
     } 

     public void setNext(Node<E> n) { 
      next = n; 
     } 
    } 

    private Node<E> header; 
    private Node<E> trailer; 
    private int size = 0; 

    public DoublyLinkedList() { 
     header = new Node<> (null, null, null); 
     trailer = new Node<> (null, header, null); 
     header.setNext(trailer); 
    } 

    public int size() { 
     return size; 
    } 

    public boolean isEmpty() { 
     return size == 0; 
    } 

    /** Returns (but does not remove) the first element of the list. */ 
    public E first() { 
     if (isEmpty()) { 
      throw new NoSuchElementException("List empty"); 
     } 
     return header.getNext().getElement(); 
    } 

    /** Returns (but does not remove) the last element of the list. */ 
    public E last() { 
     if (isEmpty()) { 
      throw new NoSuchElementException("List empty"); 
     } 
     return trailer.getPrev().getElement(); 
    } 

    public E indexOf(int pos) { 
     if (isEmpty()) { 
      throw new NoSuchElementException("List empty"); 
     } 
     Node<E> node = header.getNext(); 
     for (int i = 0; i < pos; i++) { 
      node = node.getNext(); 
     } 
     return node.getElement(); 
    } 

    // public update methods 
    public void addFirst(E e) { 
     add(e, header, header.getNext()); 
    } 

    public void addLast(E e) { 
     add(e, trailer.getPrev(), trailer); 
    } 

    public void addAtPosition(E e, int pos) { 
     Node<E> temp = header.getNext(); 
     for (int i = 0; i < pos; i++) { 
      temp = temp.getNext(); 
     } 
     add(e, temp.getPrev(), temp.getNext()); 
     temp.setNext(temp.getNext()); 
    } 

    public E removeFirst() { 
     if (isEmpty()) { 
      throw new NoSuchElementException("List empty"); 
     } 
     return remove(header.getNext()); 
    } 

    public E removeLast() { 
     if (isEmpty()) { 
      throw new NoSuchElementException("List empty"); 
     } 
     return remove(trailer.getPrev()); 
    } 

    public E removeAtPosition(int pos) { 
     if (isEmpty()) { 
      throw new NoSuchElementException("List empty"); 
     } else { 
      Node<E> node = header.getNext(); 
      for (int i = 0; i < pos; i++) { 
       node = node.getNext(); 
      } 
      return remove(node.getNext()); 
     } 
    } 

    // private update methods 
    /** Adds element e to the linked list in between the given nodes. */ 
    private void add(E e, Node<E> predecessor, Node<E> successor) { 
     Node<E> node = new Node<> (e, predecessor, successor); 
     predecessor.setNext(node); 
     successor.setPrev(node); 
     size++; 
    } 

    /** Removes the given node from the list and returns its element. */ 
    private E remove(Node<E> node) { 
     Node<E> predecessor = node.getPrev(); 
     Node<E> successor = node.getNext(); 
     predecessor.setNext(successor); 
     successor.setPrev(predecessor); 
     size--; 
     return node.getElement(); 
    } 

    public String toString() { 
     String str = ""; 
     Node< E> node = header; 
     while (node.getNext() != null) { 
      node = node.getNext(); 
      str = str + node.getElement() + "-->"; 
     } 
     return str; 
    } 
} 
+2

너무 많은 코드가 여기에 있기 때문에 나는이 질문을 downvoted했다. 문제가 어디서 발생했는지 정확하게 알 수 있도록 문제를 직접 일으키는 코드는 제거하고 10 줄 이하로 줄이면 downvote를 철회하는 것을 고려해 보겠습니다. 참조 : [최소, 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) 및 [소규모 프로그램을 디버깅하는 방법] (https://ericlippert.com/2014/03/05)/how-to-debug-small-programs /) –

+1

이 코드는 어떻게됩니까? 그것은 의미가 없습니다 :'temp.setNext (temp.getNext());' – ubadub

답변

0

나는 당신의 대답을 수정했습니다. 이것은 지금 작동해야합니다.

DoublyLinkedList.java

import java.util.NoSuchElementException; 


public class DoublyLinkedList<E> { 
    private static class Node<E> { 
    private E element; 
    private Node<E> prev; 
    private Node<E> next; 

    public Node(E e, Node<E> p, Node<E> n) { 
     this.element = e; 
     this.prev = p; 
     this.next = n; 
    } 

    public E getElement() { 
     return this.element; 
    } 

    public Node<E> getPrev() { 
     return this.prev; 
    } 

    public Node<E> getNext() { 
     return this.next; 
    } 

    public void setPrev(Node<E> p) { 
     prev = p; 
    } 

    public void setNext(Node<E> n) { 
     next = n; 
    } 
    } 

    private Node<E> header; 
    private Node<E> trailer; 
    private int size = 0; 

    public DoublyLinkedList() { 
    header = new Node<>(null, null, null); 
    trailer = new Node<>(null, header, null); 
    header.setNext(trailer); 
    } 

    public int size() { 
    return size; 
    } 

    public boolean isEmpty() { 
    return size == 0; 
    } 

    /** 
    * Returns (but does not remove) the first element of the list. 
    */ 
    public E first() { 
    if (isEmpty()) { 
     throw new NoSuchElementException("List empty"); 
    } 
    return header.getNext().getElement(); 
    } 

    /** 
    * Returns (but does not remove) the last element of the list. 
    */ 
    public E last() { 
    if (isEmpty()) { 
     throw new NoSuchElementException("List empty"); 
    } 
    return trailer.getPrev().getElement(); 
    } 

    public E indexOf(int pos) { 
    if (isEmpty()) { 
     throw new NoSuchElementException("List empty"); 
    } 
    Node<E> node = header.getNext(); 
    for (int i = 0; i < pos; i++) { 
     node = node.getNext(); 
    } 
    return node.getElement(); 
    } 

    // public update methods 
    public void addFirst(E e) { 
    add(e, header, header.getNext()); 
    } 

    public void addLast(E e) { 
    add(e, trailer.getPrev(), trailer); 
    } 

    public void addAtPosition(E e, int pos) { 
    if (pos > size) { 
     throw new IndexOutOfBoundsException("List has only " + size + " items."); 
    } 
    Node<E> node = getNodeAtPosition(pos); 
    add(e, node.getPrev(), node); 
    } 

    public E removeFirst() { 
    if (isEmpty()) { 
     throw new NoSuchElementException("List empty"); 
    } 
    return remove(header.getNext()); 
    } 

    public E removeLast() { 
    if (isEmpty()) { 
     throw new NoSuchElementException("List empty"); 
    } 
    return remove(trailer.getPrev()); 
    } 

    private Node<E> getNodeAtPosition(int index) { 
    Node<E> node = header; 
    for (int i=0; i <= index; i++) { 
     node = node.getNext(); 
    } 
    return node; 
    } 

    public E removeAtPosition(int pos) { 
    if (pos >= size) { 
     throw new IndexOutOfBoundsException("List has only " + size + " items."); 
    } 
    return remove(getNodeAtPosition(pos)); 
    } 

    // private update methods 

    /** 
    * Adds element e to the linked list in between the given nodes. 
    */ 
    private void add(E e, Node<E> predecessor, Node<E> successor) { 
    Node<E> node = new Node<>(e, predecessor, successor); 
    predecessor.setNext(node); 
    successor.setPrev(node); 
    size++; 
    } 

    /** 
    * Removes the given node from the list and returns its element. 
    */ 
    private E remove(Node<E> node) { 
    Node<E> predecessor = node.getPrev(); 
    Node<E> successor = node.getNext(); 
    predecessor.setNext(successor); 
    successor.setPrev(predecessor); 
    size--; 
    return node.getElement(); 
    } 

    public String toString() { 
    String str = ""; 
    Node<E> node = header.getNext(); 
    while (node != trailer) { 
     str = str + node.getElement() + "-->"; 
     node = node.getNext(); 
    } 
    return str; 
    } 
} 

Tester.java

public class Tester { 
    public static void main(String[] args) { 
    DoublyLinkedList<Integer> d = new DoublyLinkedList<>(); 
    d.addAtPosition(0, 0); 
    d.addAtPosition(1, 1); 
    System.out.println(d); 
    d.removeAtPosition(0); 
    System.out.println(d); 
    } 
} 
+0

thankyou! 그것은 @ Yasser Hussain에서 작동합니다. – wittyButterfly