2015-04-15 107 views
4

我正在學習一門編程課,我有以下任務。鏈接列表的remove()方法

編寫一個菜單驅動的程序,可以接受單詞及其含義,也可以按詞典順序(即在字典中)顯示單詞列表。當要將詞條添加到字典中時,必須先將該詞作爲一個字符串輸入,然後將其含義作爲單獨的字符串輸入。另一個要求 - 不時地語言變得過時。發生這種情況時,必須從字典中刪除此類字詞。

使用JOptionPane類輸入信息。

使用鏈表的概念來執行此練習。您至少需要以下課程:

  • WordMeaning類,它包含單詞的名稱及其含義。
  • 一個WordMeaningNode類,用於創建信息節點及其 鏈接字段。
  • 一個WordList類,用於創建和維護單詞的鏈接列表和 其含義。
  • 一個測試你的類的Dictionary類。

對於輸出,程序應該產生兩個滾動列表:

  • 詞和它們的含義的當前列表。
  • 刪除單詞的列表。你不需要列出意義,只需要 這個詞。

到目前爲止,除了remove方法之外,我已經編碼了一切,我不確定如何編碼,所以任何人都可以幫助我。我已經編寫了add方法,但是現在我不知道我的WordList類中的remove方法從哪裏開始。我的課程如下。

單詞表類:

public class WordList { 

WordMeaningNode list; 

WordList() { 
    list = null; 
} 

void add(WordMeaning w)// In alphabetical order 
{ 
    WordMeaningNode temp = new WordMeaningNode(w); 

    if (list == null) 
     list = temp; 
    else 
    { 
     WordMeaningNode aux = list; 
     WordMeaningNode back = null; 
     boolean found = false; 

     while(aux != null && !found) 
      if(temp.getWordMeaning().getName().compareTo(aux.getWordMeaning().getName()) < 0) 
       found = true; 
      else 
      { 
       back = aux; 
       aux = aux.next; 
      } 

     temp.next = aux; 
     if (back == null) 
      list = temp; 
     else 
      back.next = temp; 
    } 
} 

boolean listIsEmpty() { 
    boolean empty; 
    if (list == null) { 
     empty = true; 
    } else { 
     empty = false; 
    } 

    return empty; 
} 

public String toString() 
{ 
    String result = ""; 
    int count = 0; 
    WordMeaningNode current = list; 

    while (current != null) 
    { 
     count++; 
     result += current.getWordMeaning().getName() + "\n" + "\t" + current.getWordMeaning().getDefinition(); 
     current = current.next; 
    } 

    return result + "\nThe number of words is : " + count; 
} 
} 

我想,像我一樣的add方法使用相同的方法格式remove方法,但並沒有真正的工作,或者我沒有錯。

+0

不,他的任務是*代碼* WordMeaningNodes的鏈表,每個節點包含一個帶有單詞及其定義的WordMeaning實例。在發表評論前閱讀問題。 –

回答

4

要從LinkedList中刪除項目,您應該遍歷其節點。然後,如果occurence發現,連接上一個和下一個節點,設置previous.next = next

boolean remove(String word) { 

    if (list == null) // list is empty 
     return false; 

    WordMeaningNode n = list; 
    WordMeaningNode prev = null; 

    do { 
     if (n.wordMeaning.name.equals(word)) { // word found 
      if (prev != null) { 
       prev.next = n.next; // connect previous to next 
      } else { 
       list = list.next;  // connect head to next 
      } 
      return true; 
     } 
     prev = n; 
     n = n.next; 
    } while (n != null); // repeat till the end of a list 
    return false; 
} 

在主代碼,改變一片case 2

if (diction.remove(word)) { 
    obsolete.add(new WordMeaning(word, " ")); 
    // notify about deletion 
} else { 
    // notify that word don't exist. 
} 

,因爲你真的不需要NullPointerException這裏。

+0

非常感謝你:) –

+0

不客氣。順便說一句,名單的頭被用來稱爲'頭',而不是'名單'。 –

0

若要從列表中刪除元素,你需要找到的元素只是之前的一個去除,的一個刪除後設置其next參考元素

你會有一些(不是相互排斥的)極端情況要注意:

  • 如果要刪除的元素是第一個(那麼,詞表的第一個節點應該後設置爲元素一個刪除)
  • 如果元素刪除如果最後一個列表(那麼你將不得不設置一個元素的next參考null

而且,我看你需要保持一個列表rem因此不要忘記在過程中保留對已刪除項目的參考,並將其添加到過時單詞列表中。