2016-08-02 62 views
0

我創建了一個鏈接列表,以及它的一些方法。我負責創建一個名稱列表。在主要中,指示用戶輸入名稱,然後程序看到名稱是否位於列表中。它編譯,但唯一我無法弄清楚的是如何打印該名稱未找到。感謝您的幫助!這裏是我的代碼鏈接列表輸出

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(); 

    } 






    } 

} 

,這是鏈表類 類鏈表{ 公共鏈接首聯;

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

該邏輯看似NullPointerException的成熟。當列表爲空時,您將返回空鏈接。然後嘗試訪問該名稱... –

回答

0

遍歷LinkedList的模式通常保持不變。

  1. 檢查列表爲空 - >可以參考立即返回
  2. 商店對於第一鏈
  3. 雖然沒有留下任何聯繫,繼續,否則去到6
  4. 做一些邏輯返回時,當你遇到一些條件
  5. 移動鏈接,(回去4
  6. 循環已經結束,返回功能的最終狀態

在代碼現在

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; 
} 

,這是一個迭代的解決方案,但更先進的解決方案是寫相同的遞歸

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); 
} 

總之,與

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

感謝您的建議和指導!我真的很感激。我非常感謝通過迭代解決方案和遞歸解決方案展示如何實現它! –

+0

你很受歡迎。如果您覺得有用,請不要忘記[接受答案](http://stackoverflow.com/help/someone-answers)。 –

0

更換線 如果(theLinkedList.find(名稱),請將.Name == NULL){

如果(空== theLinkedList.find(名稱)){

你的聲明試圖讓鏈接對象與輸入的名稱有關,但當輸入的名稱不在列表中時,返回null而不是Link對象。檢查返回的值是否爲find函數爲空以確保該名稱不存在於列表中就足夠了。 您的代碼嘗試對名稱不存在時返回的空鏈接對象進行操作 - 這將導致空指針異常,因爲您已經看到過。