我想知道是否有人可以帮助我解决这个问题。我相信我大部分时间都了解代码和逻辑。我可以跟踪代码,这很有意义,但是我不明白的一件事是......以前的LinkedListNode如何实际更改传入的LinkedListNode n?

在我看来,该函数循环通过n,并且如果尚未找到该元素,则将其放入哈希表。但是,当再次找到它时,它将使用之前新创建的LinkedListNode跳过重复项并链接到以下元素n.next。
那实际上如何断开LinkedListNode n的连接?似乎以前是没有重复项的LinkedListNode,但是由于此函数未返回任何内容,因此n必须是更改的那个。我想我没有看到n实际如何变化。

明确和彻底的帮助将不胜感激。谢谢=)

public static void deleteDups(LinkedListNode n){

    Hashtable table = new Hashtable();
    LinkedListNode previous = null;
    while(n != null){
        if(table.containsKey(n.data))
            previous.next = n.next
        else{
            table.put(n.data, true);
            previous = n;
        }
        n = n.next;
    }
}


不行...

LinkedListNode previous = null;


创建一个新的LinkedListNode?

所以这就是我做事的逻辑...
假设参数n被传递为

5-> 6-> 5-> 7

当代码首次运行时,previous为null。它进入else语句,并且以前是5?然后线n = n.next使n 6?现在,哈希表具有5,它再次循环并进入else。 prev现在是6,而hastable有6。然后n变成5。它再次循环,但是这次进入if,而prev现在是7,n将变成7。我看到prev跳过了5,但是.. 。prev如何取消链接n?好像上一个是不包含重复项的LinkedListNode

最佳答案

LinkedListNode先前如何实际更改
  传入的LinkedListNode n?


看线


  n = n.next;


这条线使传递的节点n发生变化-在每次迭代中将其有效地向前移动一个节点。


  它使用先前新创建的LinkedListNode跳过重复项并链接到以下元素


不,这里没有新创建的节点。节点previous始终指向现有LinkedList中的一个节点,其中传递的节点n是其中一个节点。 (可能是起始节点)。是什么让您认为它是新创建的?

您似乎对节点和引用(以及整个LinkedList)在Java中的工作方式的理解感到困惑。因为所有修改都发生在Node的数据上,而不是引用本身上(ugh..thats并不完全正确),所以传递给该方法的原始LinkedList确实在该方法返回后得到了修改。您将需要详细分析LinkedList的结构和工作原理,以了解其工作原理。我建议首先弄清楚Java中按值传递和按引用传递的含义。

编辑:

您对运行的分析是正确的,但是您仍然会感到困惑,因为您对某些事情在概念上还不清楚。

在分析结束时,您会问“ .. prev如何取消链接n?看来prev是不包含重复项的LinkedListNode

这是一团糟-首先,您需要区分LinkedListNodeLinkedList本身。 prevnLinkedListNode的两个实例,而不是LinkedList本身。在您的示例中,LinkedList是未命名的(我们没有可引用的名称)。这是原始列​​表-没有其他列表。

其次,在插图中,显示的数字仅是节点的一部分,称为节点数据。您已经错过的另一部分是每个节点中都隐含的next LinkedListNode引用。绘制的链接->实际上是每个节点中的下一个引用。当您说prev跳过5时,实际上发生的是使具有数据6的下一个节点指向具有数据7的节点。

开始时:
5 | next-> 6 | next-> 5 | next-> 7 | next-> NULL

跳过5之后:
5 | next-> 6 | next-> 7 | next-> NULL

如您所见,链表已更改!使用prev或n进行更改并不重要,更改仍保留在列表中。

07-28 02:02