2016-10-22 31 views
1

我需要一些帮助来理解方法的工作原理。对Java链接列表中的节点的引用

我有这样的决定的基本Node类:

class Node { 
    Node next = null; 
    int data; 
    public Node(int d){ 
     data = d; 
    } 
} 

现在我期待在如何deleteDuplicates方法工作。我知道我们迭代地遍历每个节点并将其值存储在一个集合中。如果该值已经在该集合中,我相信我们将前一节点的next指针设置为跳过当前节点。这里的方法:

public static Node deleteDuplicates(Node head){ 
    Node n = head; 
    HashSet<Integer> set = new HashSet<Integer>(); 
    Node previous = null; 
    while(n != null) { 
     if (set.contains(n.data)){ 
      // skip this node 
      previous.next = n.next; 
     } 
     else { 
      set.add(n.data); 
      previous = n; 
     } 
     n = n.next; 

    } 
    return head; 
} 

我感到困惑的变量previousn。当我们设置previous = n;时,是不是让它们引用同一个对象?如果他们引用同一个对象,则对n所做的更改将与previous中的相同。那么线previous.next = n.next;是如何工作的?

谢谢!

+0

不应该'previous.next = n.next;'是'previous = n.next;'? – c0der

+0

@ c0der它似乎是正常的,但仍然不能解释参考问题 –

+0

我问它,因为它看起来这种方法是错误的。当'previous'为'null'时使用'previous.next'就是一个例子, – c0der

回答

2

阅读这些2线一起,

previous = n; 
n = n.next; 

因此,一旦一个节点被处理,对于前面的指针和n向前移动。 n为后前,从而先前被设置为n下一节点,并且n被移动到其下一个节点,该节点是n.next

对于缺失部分,希望下面的这些图有助于

enter image description here

+0

谢谢,我认为这清除了我的东西。我将整个链表看作是一个单独的对象,当它真的是一系列对象(它们是节点)时。所以当我们将n改为下一个节点时,我们不再引用同样的东西。我欣赏这张图! –