2017-02-11 2 views
1

Das Problem ist mit meiner findA-Methode in der DLinkedList-Klasse. Verfahren offenbar meine head.next wechselt Punkt tmp.next ich eine Liste erstellt {0,1,2,3,4,5,6,7,8,9} benutzte ichDoubly Linked List - Kopf ändert sich, ohne dass ich ihn ändere

Finda (9)

und meine Liste wird bis {9} schrumpft nach unten, obwohl Funktionen richtiges Ergebnis gibt, ob den angegebenen Wert in meiner Liste ist oder nicht (wahr oder falsch)

auf der anderen Seite, Meine Finde Methode funktioniert perfekt und der einzige Unterschied zwischen den beiden ist, dass ich Knoten tmp = head in findA a nd-Knoten tmp = head.next in find

Unten ist das vollständige Code-Snippet. Ich weiß, dass einige Implementierungen ziemlich unprofessionell sind. Eventuelle Stellungnahmen das würde

public class Node <T extends Comparable<T>> { 
T data; 
Node prev; 
Node next; 

Node(){ 
} 

Node(T val){ 
    data = val; 
} } 

public class DLinkedList<T extends Comparable<T>> { 
Node head; 
Node tail; 

DLinkedList(){ 
    head = new Node();  
    tail = new Node(); 
    tail.prev = head; 
} 

void insertInOrder(T value){ 
    Node insert = new Node(value); 
    if(head.next==null){ 
     head.next = insert; 
     insert.prev = head; 
     insert.next = tail; 
     tail.prev = insert; 
    } 
    else{ 
     insert.prev = tail.prev; 
     tail.prev.next = insert; 
     tail.prev = insert; 
     insert.next = tail; 
    } 
} 

boolean find (T value){ 
    boolean result = false; 
    Node tmp = head.next; 
    if (head!=null){ 
     while(tmp!=null){ 
      if(tmp.data.compareTo(value)!=0){ 
       tmp = tmp.next; 
      } 
      else{ 
       result = true; 
       break; 
      } 
     } 
    } 
    return result; 
} 

boolean findA (T value){ 
    boolean result = false; 
    Node tmp = head; 
    if (head!=null){ 
     while(tmp.next!=null){ 
      if(tmp.next.data.compareTo(value)!=0){ 
       tmp.next = tmp.next.next; 
      } 
      else{ 
       result = true; 
       break; 
      } 
     } 
    } 
    return result; 
} 

void deleteA(T value){ 
    Node tmp = head.next; 

    while(tmp.data.compareTo(value)!=0){ 
      tmp = tmp.next; 
    } 
    if(tmp!=tail){ 
     if(tmp==head.next) 
      head = tmp.next; 
     else 
      tmp.prev.next = tmp.next; 

     if (tmp==tail) 
      tail = tmp.prev; 
     else 
      tmp.next.prev = tmp.prev; 
    } 






} 
void delete(T value){ 
    Node tmp = head.next; 
    if(find(value)){ 
     while(tmp!=tail){ 
      if(tmp.data.compareTo(value)!=0){ 
       tmp = tmp.next; 
      } 
      else{ 
       tmp.prev.next = tmp.next; 
       tmp.next.prev = tmp.prev; 

       break; 
      } 
     }    
    } 
} 

@Override 
public String toString(){ 
    Node tmp = head.next; 
    String result = ""; 
     while(tmp!=tail){ 
      System.out.println(tmp.data); 
      tmp = tmp.next; 
     } 
    return result; 
} } 

public class ListCheck { 

public static void main(String[] args) { 
    DLinkedList list = new DLinkedList(); 
    DLinkedList listA = new DLinkedList(); 
    for(int i=0; i<10; i++){ 
     list.insertInOrder(i); 
     listA.insertInOrder(i); 
    } 
    System.out.println(listA.findA(9)); 
    System.out.println(list.find(9)); 
    listA.toString(); 
    System.out.println(""); 
    list.toString(); 
} } 
+0

Warum ändern Sie 'tmp.next' statt' tmp'? Auch wen kümmert es, wenn Kopf ist Null oder "tmp" ist "Schwanz". Einfach vom Kopf bis zum Nullpunkt wechseln. – CollinD

+0

@CollinD weil ich meine tmp als Kopf initiierte, und mein Kopf speichert keine Daten nach Design – hsnsd

+0

Ja, und die Änderung 'tmp.next' ändert' head.next', da 'next' eine Referenz ist. – CollinD

Antwort

0

In Ihrem Finda geschätzt werden, so, wie Sie tmp bewegen ist von

tmp.next = temp.next.next 

auf diese Weise tun Sie den aktuellen Zeiger zerstören und es an den nächsten Knoten Umleitung (java flache Kopie):

tmp--->[node1]--->[node2] Änderungen tmp--->[node2]

daher am Ende der Operation, Ihre LinkedList nur hat der letzte Knoten links.

ändern es tmp = tmp.next würde helfen

Verwandte Themen