【问题标题】:Java: Linked list node questionsJava:链表节点问题
【发布时间】:2018-05-05 16:55:18
【问题描述】:

我正在学习链表并遇到以下代码

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 如何彼此相等,因为它们都应该为空。我也不明白为什么最后一个 else 语句中的 prev.next 不能代替 current 因为它们应该是基于 while 循环中前一个 else 语句的相同值。

【问题讨论】:

  • “我很难理解...... data.next 和 current 如何彼此相等” -- 你的问题不清楚......声明@ 987654323@ 是一个assignment,它将current 的值复制到data.next。在该语句之后,data.next 将引用 current 所引用的同一对象。你有什么不明白的?
  • 一旦在 while 循环中找到匹配位置,您必须将数据节点与当前节点(从 while 循环中找到)和前一个节点链接。如果列表为空,则将元素添加到头部。这正在发生。 check this

标签: java linked-list


【解决方案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。这就是单独检查的原因。

【讨论】:

    【解决方案2】:

    此代码将单词插入到链表中,以便生成的链表中的单词按升序排列。 data 是有单词的新节点; while 循环中的 if 条件是检查 current 节点中的单词是否大于 data 节点中的单词。如果是这样,将found 设置为true,否则将current 节点分配给前一个节点,将current 的下一个节点分配给current 节点。重复此过程,直到while 中的条件评估为假。

    这里有两种情况:

    1. 一旦current 节点中的单词大于data 节点found 中的单词,则为真。现在我们知道current 节点中的单词按字母顺序大于data 节点中的单词;所以将current 节点作为data 节点的下一个节点。这正是data.next = current; 正在做的事情。我们还知道data 节点中的单词按字母顺序大于prev 节点中的单词,因此将data 节点设为prev 节点的下一个节点。这正是prev.next = data;else 正在做的事情。
    2. 这种情况是当列表为空时。当列表为空时,if (prev == null) head = data; 使 data 节点成为 head 节点。

    【讨论】:

      猜你喜欢
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多