2016-08-02 8 views
0

Ich habe eine verknüpfte Liste und einige Methoden dafür erstellt. Ich wurde beauftragt, eine Namensliste zu erstellen. Im Wesentlichen wird der Benutzer angewiesen, einen Namen einzugeben, und dann sieht das Programm, ob der Name in der Liste enthalten ist. Es kompiliert, aber die einzige Sache, die ich nicht herausfinden kann, ist, wie man druckt, dass der Name nicht gefunden wurde. Danke für Ihre Hilfe! hier ist mein CodeVerkettete Listen Ausgabe

package linkedlists; 
import java.util.*; 

public class Link { 

public String Name; 
public Link next; 

public Link(String Name){ 
    this.Name = Name; 
} 

public void display(){ 
    System.out.println("Name in List " + Name); 
} 

@Override 
public String toString(){ 
    return Name; 
} 

public static void main(String[] args) { 

    Scanner input = new Scanner (System.in); 


    LinkList theLinkedList = new LinkList(); 
    theLinkedList.insertFirstLink("James"); 
    theLinkedList.insertFirstLink("John"); 
    theLinkedList.insertFirstLink("Michael"); 
    theLinkedList.insertFirstLink("Peter"); 
    theLinkedList.insertFirstLink("Allison"); 
    theLinkedList.insertFirstLink("Daniel"); 
    theLinkedList.insertFirstLink("George"); 
    theLinkedList.insertFirstLink("Simon"); 
    theLinkedList.insertFirstLink("Jason"); 
    theLinkedList.insertFirstLink("Mark"); 

    System.out.print("Please enter a Name to search for"); 
    System.out.println(); 

    String name; 
    name = input.nextLine(); 

    //System.out.println(theLinkedList.find(name).Name); 

    if (theLinkedList.find(name).Name == null){ 
     System.out.println("Not Found"); 
     System.out.println(); 
     theLinkedList.display(); 
    } 
    else { 
     System.out.println(theLinkedList.find(name).Name + " was found."); 
     System.out.println(); 
     theLinkedList.display(); 

    } 






    } 

} 

und dies ist die Linklist Klasse Klasse Linklist { public link FIRST;

LinkList(){ 

    firstLink = null; 

} 

public boolean isEmpty(){ 
    return (firstLink == null); 

} 

public void insertFirstLink(String Name){ 
    Link newLink = new Link(Name); 
    newLink.next = firstLink; 
    firstLink = newLink; 
} 

public Link removeFirst(){ 
    Link linkReference = firstLink; 
    if (!isEmpty()){ 
     firstLink = firstLink.next; 

    } 
    else { 
     System.out.println("Empty Linked List"); 

    } 
    return linkReference; 
} 

public void display(){ 

    Link theLink = firstLink; 

    while (theLink != null){ 
     theLink.display(); 
     System.out.println("Next Name in List: " + theLink.next); 
     theLink = theLink.next; 
     System.out.println();    
    } 

} 

public Link find(String Name){ 
    Link theLink = firstLink; 

    if(!isEmpty()){ 

     while(!(theLink.Name.equals(Name))){ 

      if(theLink.next == null){ 
       return null; 

      } else { 
       theLink = theLink.next; 

      } 

     } 

    } else { 

     System.out.println("Empty LinkedList"); 

    } 

    return theLink; 

} 

public Link removeLink(String Name){ 
    Link currentLink = firstLink; 
    Link previousLink = firstLink; 

    while(currentLink.Name != Name){ 
     if (currentLink.next == null){ 
      return null; 
     } 
     else{ 
      previousLink = currentLink; 
      currentLink = currentLink.next; 

     } 

    } 
    if (currentLink == firstLink){ 
     firstLink = firstLink.next; 
    } 
    else { 
     System.out.println(" Found a match!"); 
     System.out.println("Current Link: " + currentLink); 
     System.out.println("First Link: " + firstLink); 

     previousLink.next = currentLink.next; 

    } 
    return currentLink; 
    } 

} 
+1

Diese Logik scheint reif für eine NullPointerException. Wenn die Liste leer ist, geben Sie eine Nullverbindung zurück. Dann versuchen Sie, auf den Namen zuzugreifen ... –

Antwort

0

Das Muster zum Durchlaufen einer LinkedList bleibt im Allgemeinen gleich.

  1. Überprüfen Sie, ob die Liste leer ist -> Kann sofort zurück
  2. Shop einen Verweis auf den ersten Link
  3. Während es einen Link links ist, weiter auf, sonst gehen zu 6
  4. einige Logik tun , Rückkehr, wenn Sie eine Bedingung
  5. Bewegen Sie den Link zu erfüllen, (gehen Sie zurück zu 4)
  6. die Schleife beendet ist, kehren den Endzustand der Funktion

In Code

public Link find(String Name){ 

    if(isEmpty()) { 
     System.out.println("Empty LinkedList"); 
     return null; 
    } 

    Link theLink = firstLink; 
    while(theLink != null) { 
     if (theLink.Name.equals(Name)) { 
      return theLink; 
     } 

     theLink = theLink.next; 
    } 

    // looped through the whole list, didn't find anything 
    return null; 
} 

Nun, das ist eine iterative Lösung, aber die erweiterte Lösung ist, dasselbe zu schreiben rekursiv

public Link find(String Name) { 
    if(isEmpty()) { 
     System.out.println("Empty LinkedList"); 
     return null; 
    } 
    return findRecur(firstLink, Name); 
} 

private Link findRecur(Link link, String Name){ 
    if (link == null) return null; 
    if (link.Name.equals(Name)) return link; 
    return findRecur(link.next, Name); 
} 

So oder so, rufen Sie mit

final Link found = theLinkedList.find(name); 
if (found == null){ 
    System.out.println("Not Found"); 
} else { 
    System.out.println(found.Name + " was found."); 
} 
System.out.println(); 
theLinkedList.display(); 
+0

Danke für die Beratung und Anleitung! Ich weiß es wirklich zu schätzen. Ich schätze es sehr, Ihnen zu zeigen, wie man es mit einer iterativen Lösung und der rekursiven Lösung macht! –

+0

Sie sind herzlich willkommen. Vergessen Sie nicht, [die Antwort zu akzeptieren] (http://stackoverflow.com/help/someone-answers), wenn Sie dies nützlich finden. –

0

Die Zeileersetzenif (theLinkedList.find (Name) .Name == null) {

mit

if (null == theLinkedList.find (Name)) {

Ihre Aussage versucht, das Link-Objekt zu erhalten bezogen auf den eingegebenen Namen, aber wenn der eingegebene Name nicht in der Liste enthalten ist, wird anstelle eines Link-Objekts null zurückgegeben. Es ist ausreichend zu überprüfen, dass der zurückgegebene Wert von der Suchfunktion null ist, um sicherzustellen, dass der Name nicht in der Liste vorhanden ist. Ihr Code hat versucht, mit dem Null-Link-Objekt zu arbeiten, das zurückgegeben wurde, als der Name nicht existierte. Dies führt zu einer Nullzeiger-Ausnahme, die Sie gesehen haben müssen.