如何实际更改链表

时间:2011-09-27 08:11:09

标签: java linked-list duplicates

我想知道是否有人可以帮我解决这个问题。我相信我理解大部分的代码和逻辑。我可以跟踪代码,这是有道理的,但有一件事我没有得到.... LinkedListNode先前如何实际更改传入的LinkedListNode?

在我看来,函数循环遍历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?

所以这是我如何做到这一点的逻辑...... 让我们说参数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,它不包含重复项

2 个答案:

答案 0 :(得分:2)

  

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

看一下

  

n = n.next;

这一行导致传递的节点n发生变化 - 每次迭代都会向前移动一个节点。

  

它使用这个新创建的LinkedListNode previous来跳过副本并链接到以下元素

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

看起来你很难理解节点和引用(以及整个LinkedList)如何在Java中工作。因为所有修改都发生在Node的数据上,而不是引用本身,(呃......这不完全正确),传递给方法的原始LinkedList确实在方法返回后被修改。您需要详细分析LinkedList结构和工作方式,以了解其工作原理。我建议首先明确一下通过值传递的内容,并通过引用传递给Java。

编辑:

你对这次跑步的分析是正确的,但是你的困惑仍然存在,因为你在概念上对某些事情并不清楚。

在分析结束时,您会问“..how prev取消链接nprev似乎LinkedListNode不包含重复内容”< / p>

这是一团糟 - 首先,您需要区分LinkedListNodeLinkedList本身。 prevnLinkedListNode的两个实例,而不是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字段的引用分配给节点,实际上取消了当前节点的链接。