This question already has answers here:
Is Java “pass-by-reference” or “pass-by-value”?
                                
                                    (86个答案)
                                
                        
                                4年前关闭。
            
                    
在“破解编码面试链接列表”问题中:
编写代码以从未排序的链表中删除重复项,解决方案是

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;
  }
}


我的问题是,为什么n = n.next不更改传递给函数的链表,而做previous.next = n.nextprevious = n却改变传递的链表?

最佳答案

n是对LinkedListNode的引用。通过在此处设置其他值,您无需修改​​原始的LinkedListNode,只需将引用从其更改为其他内容即可。换句话说,您“记住”了标签“ n”下的新内容,但没有修改原始的“ n”。

X x = new X();
x = new X(); // this does not modify the original x


previousLinkedListNode,通过设置该LinkedListNode的值OF,可以对其进行修改。

X x = new X();
x.y = new Y(); // this does mofiy the original x


换句话说,您正在设置一个您记得为“上一个”的值的属性。

而且,正如dimo414已经提到的那样,在此处使用HashTable是一个坏主意。仅凭清晰度就足以使用简单的(Hash-)Set。

关于java - 链接列表和指针说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32057058/

10-12 22:28