2017-12-01 2 views
-4

Ich bin nicht in der Lage, den Knoten bei einem bestimmten Index einzufügen und zu entfernen.Implementierung von doppelt verknüpften Liste mit Generics

Das Problem besteht darin, dass der Einsatz in einer Position ist und an der Position entfernt wird.

Gäbe es drei Elemente, wenn ich das Element in der Mitte einzusetzen, es war aber nach dem Einsetzen der Knoten, der als I druckt null wurde eingeführt wird. Wo bin ich falsch gelaufen?

Hier ist mein Code,

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

Ich habe diese Frage, weil es hier downvoted viel zu viel Code. Um genau zu verdeutlichen, wo Ihr Problem liegt, entfernen Sie bitte den Code, der Ihr Problem nicht direkt verursacht, und wenn Sie ihn auf zehn Zeilen oder weniger reduzieren können, werde ich erwägen, den Downvote zurückzuziehen. Siehe: [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve) und [Debuggen von kleinen Programmen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs /) –

+1

Was ist los mit diesem Code? Es ergibt keinen Sinn: 'temp.setNext (temp.getNext());' – ubadub

Antwort

0

Ich habe Ihre Antwort geändert. Dies sollte jetzt funktionieren.

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

danke! Es funktioniert @ Yasser Hussain – wittyButterfly

Verwandte Themen