链接列表和指针说明

时间:2015-08-17 18:16:01

标签: java linked-list

在Cracking the Coding Interview Linked List问题中: 编写代码以从未排序的链表中删除重复项,解决方案是

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是否会改变传入的链表?

2 个答案:

答案 0 :(得分:5)

n是对LinkedListNode的引用。通过在那里设置不同的值,您不会修改原始LinkedListNode,只需将引用更改为其他内容即可。换句话说,你在“n”标签下“记住”了一些新内容,但是你没有修改原来的“n”。

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

previousLinkedListNode,通过设置LinkedListNode的值,您正在修改它。

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

换句话说,您正在设置您记住的值为“previous”的属性。

而且,正如dimo414已经提到的,在这里使用HashTable是一个坏主意。仅使用清晰度就足以成为使用简单(Hash-)集的理由。

答案 1 :(得分:1)

n是指向相关链表节点的指针。

n = n.next

只需将指针移动到下一个节点即可。

previous.next = n.next

更改节点“previous”指向的位置。 previous.next是对象“previous”中包含的值,前一个节点之后的节点。所以previous.next = n.next修改了“previous”节点对象。