【问题标题】:remove() method of a linked list链表的 remove() 方法
【发布时间】:2015-04-15 15:07:46
【问题描述】:

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

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

使用 JOptionPane 类来输入信息。

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

  • 包含单词名称及其含义的 WordMeaning 类。
  • 创建信息节点的 WordMeaningNode 类及其 链接字段。
  • 一个 WordList 类,它创建和维护一个单词的链接列表和 它们的含义。
  • 一个字典类,用于测试您的类。

对于输出,程序应该产生两个可滚动的列表:

  • 当前单词列表及其含义。
  • 已删除单词的列表。您无需列出含义,只需 的话。

到目前为止,除了 remove 方法之外,我已经编写了所有代码,但我不知道如何编写代码,所以请任何人帮助我。我已经编写了 add 方法,但是现在我不知道从 WordList 类中的 remove 方法从哪里开始。我的课在下面。

WordList 类:

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

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

【问题讨论】:

  • 不,他的任务是编码一个 WordMeaningNodes 的链表,每个节点都包含一个 WordMeaning 实例,其中包含一个单词及其定义。在发布 cmets 之前阅读问题。

标签: java data-structures linked-list


【解决方案1】:

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

在主代码中,更改case 2

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

因为你在这里真的不需要NullPointerException

【讨论】:

  • 不客气。顺便说一句,列表的头部被称为head,而不是list
【解决方案2】:

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

您将需要注意一些(不是相互排斥的)极端情况:

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

另外,我发现您需要保留已删除项目的列表,因此请不要忘记在此过程中保留已删除项目的参考,并将其添加到您的过时单词列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2014-12-23
    • 1970-01-01
    • 2014-05-11
    • 2022-06-17
    • 1970-01-01
    • 2018-10-16
    • 2012-08-21
    相关资源
    最近更新 更多