2017-12-01 18 views
-4

特定のインデックスにノードを挿入および削除できません。ジェネリックを使用した二重リンクリストの実装

問題は、ある位置に挿入して、その位置で取り除くことです。

三つの要素があった場合、私は真ん中の要素を挿入する場合、それ は挿入私が挿入されたノードが ヌルとして印刷された後ました。どこが間違っていたのですか?ここで

私はあなたの答えを変更した

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

あまりにも多くのコードがここにありますので、私はこの質問をd​​ownvotedしています。あなたの問題がどこにあるのかを明確にするためには、問題を直接引き起こしていないコードを削除してください。もしそれを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

ありがとう!それは@ Yasser Hussain – wittyButterfly

関連する問題