我正在学习链接列表并遇到以下代码
public void add(WordMeaning wm)
{
WordMeaningNode data = new WordMeaningNode(wm);
if (head == null)
head = data;
else
{
WordMeaningNode current = head, prev = null;
boolean found = false;
while (current != null && !found)
{
if (data.getWordMeaning().getWord().compareTo(current.getWordMeaning().getWord()) < 0)
found = true;
else
{
prev = current;
current = current.next;
}
}
data.next = current;
if (prev == null)
head = data;
else
prev.next = data;
}
}
此代码用于获取单词和定义,然后使用LinkedList中的其他值按字母顺序对单词进行排序。我理解如何在不按字母顺序排序的情况下在LinkedList中存储单词,但是我无法理解从data.next = current和后面的if语句开始的最后一部分。具体来说,data.next和current可以如何彼此相等,因为它们都应该为null。我也不明白为什么最后一个else语句中的prev.next不能替换为current,因为它们应该是基于while循环中前一个else语句的相同值。
答案 0 :(得分:2)
此代码将单词插入到链接列表中,以便生成链接列表中的单词按升序排列。 data
是具有单词的新节点; if
循环中的while
条件检查current
节点中的单词是否大于data
节点中的单词。如果是这样,请将found
设置为true,否则将current
节点分配给前一个current
的{{1}}节点的下一个节点。重复此过程,直到current
中的条件评估为false。
这里有两种情况:
while
节点中的单词大于current
节点中的单词data
变为真。现在我们知道found
节点中的单词按字母顺序大于current
节点中的单词;所以将data
节点作为current
节点的下一个节点。这正是data
正在做的事情。我们还知道data.next = current;
节点中的单词按字母顺序大于data
节点中的单词,因此将prev
节点作为data
节点的下一个节点。这正是prev
prev.next = data;
正在做的事情。else
使if (prev == null) head = data;
节点成为data
节点。答案 1 :(得分:1)
简单的答案是他们不平等。你忘了在代码data.next = current;
中,它没有断言两者是相等的。它将data.next
设置为current
。
如果它仍然没有意义,请以这种方式思考:
节点prev
已链接到节点current
,因为prev.next == current
:
prev
prev.next ------> current
current.next
但是,我们希望在两者之间插入data
。这是以后列表的样子:
prev
prev.next ------> data
data.next ------> current
current.next
因此,有两件事需要发生:
prev.next
需要设置为data
。 (我们想要更改链接而不是链接到的内容,因此我们必须写prev.next
,而不是current
。)data.next
需要设置为current
。你也是正确的,当前的可以为空,但这没关系,因为我们被允许将事物设置为空。如果prev
为空,则更为关注,因为如果不存在prev,则无法访问prev.next
。这就是为什么要单独检查的原因。