Java 链表的remove()方法

Java 链表的remove()方法,java,data-structures,linked-list,Java,Data Structures,Linked List,我正在上编程课,我有以下作业 编写一个菜单驱动的程序,该程序要么接受单词及其含义,要么按词典顺序显示单词列表(如在词典中)。当一个条目要添加到词典中时,必须首先将该单词作为一个字符串输入,然后将其含义作为单独的字符串输入。另一个要求是,单词有时会过时。发生这种情况时,必须从字典中删除此类单词 使用JOptionPane类输入信息 使用链表的概念来执行此练习。您至少需要以下课程: 包含单词名称及其含义的WordMeansion类 WordMeaningNode类,用于创建信息节点及其 链接字段

我正在上编程课,我有以下作业

编写一个菜单驱动的程序,该程序要么接受单词及其含义,要么按词典顺序显示单词列表(如在词典中)。当一个条目要添加到词典中时,必须首先将该单词作为一个字符串输入,然后将其含义作为单独的字符串输入。另一个要求是,单词有时会过时。发生这种情况时,必须从字典中删除此类单词

使用JOptionPane类输入信息

使用链表的概念来执行此练习。您至少需要以下课程:

  • 包含单词名称及其含义的WordMeansion类
  • WordMeaningNode类,用于创建信息节点及其 链接字段
  • 一个单词列表类,用于创建和维护单词和单词的链接列表 它们的含义
  • 测试类的字典类
对于输出,程序应生成两个可滚动列表:

  • 当前单词列表及其含义
  • 已删除单词的列表。你不需要列出含义,只要 这些话
到目前为止,除了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;
}
}
公共类单词列表{
WordMeaningNode列表;
词表(){
列表=空;
}
void add(wordmeans w)//按字母顺序排列
{
WordMeaningNode临时=新WordMeaningNode(w);
if(list==null)
列表=临时;
其他的
{
WordMeaningNode aux=列表;
WordMeaningNode back=null;
布尔值=false;
while(aux!=null&&!找到)
如果(临时GetWordMeansing().getName().compareTo(辅助GetWordMeansing().getName())<0)
发现=真;
其他的
{
返回=辅助;
aux=aux.next;
}
温度下一个=辅助;
if(back==null)
列表=临时;
其他的
back.next=温度;
}
}
布尔列表空(){
布尔空;
if(list==null){
空=真;
}否则{
空=假;
}
返回空;
}
公共字符串toString()
{
字符串结果=”;
整数计数=0;
WordMeaningNode当前=列表;
while(当前!=null)
{
计数++;
结果+=current.getWordMeaning().getName()+“\n”+“\t”+current.getWordMeaning().getDefinition();
当前=当前。下一步;
}
返回结果+“\n字数为:”+count;
}
}

我尝试对remove方法使用与add方法相同的方法格式,但没有真正起作用,或者我做得不对。

要从LinkedList中删除项目,应在其节点上进行迭代。然后,如果发现发生,连接上一个和下一个节点,设置
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;
}
在主代码中,更改案例2的
片段:

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

因为这里确实不需要
NullPointerException

要从列表中删除元素,需要在要删除的元素之前找到该元素,并将其
next
引用设置为要删除的元素之后的元素

您将需要注意一些(并非相互排斥的)角落案例:

  • 如果要删除的元素是第一个(则WordList的第一个节点应设置为要删除的元素之后的元素)
  • 如果要删除的元素是列表中的最后一个元素(则必须将上一个元素的
    next
    引用设置为
    null

此外,我发现您需要保留一个已删除项目的列表,因此在这个过程中不要忘记保留对已删除项目的引用,并将其添加到您的已过时单词列表中。

否,他的任务是编写一个WordMeaningNodes链接列表,每个节点包含一个WordMeaning实例,其中包含一个单词及其定义。在发表评论之前阅读问题。不客气。顺便说一句,列表的标题通常被称为
head
,而不是
list