2

这是我的中级 Java 课程的作业问题。我应该使用链接列表而不使用内置的添加方法来制作“字典”。我无法让它按字母顺序添加节点。我只是将每个节点附加或附加到列表中没有问题,但这不是问题所要求的。该程序应该能够按字母升序和降序(两个单独的 JOptionPane 菜单选项)显示单词列表(及其含义)。它的证明......困难。这是我的添加方法:

void add(WordMeaning wm)
{
    WordMeaningNode word = new WordMeaningNode(wm);
    WordMeaningNode current, prev;

    try
    {
        if(wmn == null)
        {
            wmn = word;
        }
        else
        {
            current = wmn;
            prev = null;
            while(current.next != null)
            {
                prev = current;
                current = current.next;
            }
            if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) < 0)
            {
                word.next = current.next;
                current.next = word;
            }
            else if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) > 0)
            {
                prev = current;
                current.next = word;
            }
        }
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
}

我确实知道 while 循环下的 if 语句有问题。我只是不知道是什么。我还不够好,还不知道出了什么问题(笑)。我想知道我是否应该先正常附加它们,然后按字母顺序对其进行排序。如果是这样,那我该怎么做?请温柔一点。;)

4

2 回答 2

0

我认为您可以先按升序添加所有单词,然后按所需的顺序(升序/降序)对其进行迭代。由于您已经有了具有上一个和下一个节点的双链表,因此迭代应该不是问题。尝试 :

while(current.next != null)
        {
            prev = current;
            current = current.next;

            if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) > 0)
            {
                word.next = current.next;
                current.next = word;
                break;  // break when correct position of word is found in ascending order.
            }
          /*  else if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) > 0)
            {
                prev = current;
                current.next = word;
            }
          */  // No else condition is required
        }
}
于 2012-11-17T09:17:05.013 回答
0

您的 while 循环跳到链表的末尾。最后,您尝试确定在哪里插入或附加节点(如果您提到。)

您要做的是跳到插入点(找到比要插入的节点更大的节点后面的节点。)

您需要类似(伪代码,因为这是一个作业):

boolean found = false;
while (!found && current.next != null) {
    if (next word > word) {
        found = true;
    } else {
         prev = current;
         current = current.next;
    }
}
if (!found) {
    append to end of list
} else {
    insert before next
}
于 2012-11-17T09:20:55.063 回答