我想知道是否有人可以帮我解决这个问题。我相信我理解大部分的代码和逻辑。我可以跟踪代码,这是有道理的,但有一件事我没有得到.... LinkedListNode先前如何实际更改传入的LinkedListNode? p>
在我看来,函数循环遍历n,如果尚未找到该元素,则将其置于哈希表中。但是当它再次被发现时,它使用这个新创建的LinkedListNode previous来跳过副本并链接到下面的元素,即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? p>
所以这是我如何做到这一点的逻辑...... 让我们说参数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,但是... .how是否正在取消联系?看起来prev是LinkedListNode,它不包含重复项
答案 0 :(得分:2)
LinkedListNode之前是如何实际更改的 传入的LinkedListNode n?
看一下
行n = n.next;
这一行导致传递的节点n发生变化 - 每次迭代都会向前移动一个节点。
它使用这个新创建的LinkedListNode previous来跳过副本并链接到以下元素
不,这里没有新建的节点。节点previous
总是指向现有LinkedList中的节点,其中传递的节点n是节点之一。 (可能是起始节点)。是什么让你认为它是新创建的?
看起来你很难理解节点和引用(以及整个LinkedList)如何在Java中工作。因为所有修改都发生在Node的数据上,而不是引用本身,(呃......这不完全正确),传递给方法的原始LinkedList确实在方法返回后被修改。您需要详细分析LinkedList结构和工作方式,以了解其工作原理。我建议首先明确一下通过值传递的内容,并通过引用传递给Java。
编辑:
你对这次跑步的分析是正确的,但是你的困惑仍然存在,因为你在概念上对某些事情并不清楚。
在分析结束时,您会问“..how prev
取消链接n
?prev
似乎LinkedListNode
不包含重复内容”< / p>
这是一团糟 - 首先,您需要区分LinkedListNode
和LinkedList
本身。 prev
和n
是LinkedListNode
的两个实例,而不是LinkedList
本身。在您的示例中,LinkedList
未命名(我们没有名称来引用它)。这是原始列表 - 没有其他列表。
其次,在您的插图中,您显示的数字只是节点的一部分,称为节点数据。您错过的另一部分是每个节点中隐含的next
LinkedListNode引用。您绘制的链接 - &gt;实际上是每个节点中的下一个引用。当你说prev跳过5时,实际发生的是带有数据6的下一个节点指向带有数据7的节点。
开始时: 5 |下一个 - &gt; 6 |下一个 - &gt; 5 |下一个 - &gt; 7 |下一步 - &GT; NULL
跳过5后: 5 |下一个 - &gt; 6 |下一个 - &gt; 7 |下一步 - &GT; NULL
如您所见,链接列表已更改!如果使用prev或n更改它无关紧要,则更改仍保留在列表中。
答案 1 :(得分:1)
if(table.containsKey(n.data))
previous.next = n.next
是删除的部分。它在当前节点之后将先前节点的next
字段的引用分配给节点,实际上取消了当前节点的链接。