我想知道是否有人可以帮助我解决这个问题。我相信我大部分时间都了解代码和逻辑。我可以跟踪代码,这很有意义,但是我不明白的一件事是......以前的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
”
这是一团糟-首先,您需要区分LinkedListNode
和LinkedList
本身。 prev
和n
是LinkedListNode
的两个实例,而不是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进行更改并不重要,更改仍保留在列表中。