我正在将一个LinkedListNode发送到一个方法(removeLinkListNodeDuplication)中,以删除重复的条目。它通过LinkedListNode进行迭代,并在Hashtable的帮助下找到重复的值。
我想知道为什么我的LinkedListNode的实例在我的删除方法(removeLinkListNodeDuplication)结束时为null,但在它从我的删除方式中出来后,它变成了我的预期。
这是我的LinkedListNode类
public class Node {
Node next = null;
int data;
public Node(int d) {
data = d;
}
public void appendToTail(int d) {
Node end = new Node(d);
Node n = this;
while (n.next != null) {
n = n.next;
}
n.next = end;
}
}
在下面,我将创建上面类的一个实例,并将其传递给我的delete方法。
Node linkList =new Node(1);
linkList.appendToTail(1);
linkList.appendToTail(1);
linkList.appendToTail(2);
removeLinkListNodeDuplication(linkList);
// link list values are as expected i.e. 1,2 ?!
下面是我的删除方法
public void removeLinkListNodeDuplication(Node listNode) {
Node previous =null;
Hashtable<Integer,Boolean> hashtable=new Hashtable<Integer, Boolean>();
while (listNode!=null){
if(hashtable.containsKey(listNode.data)){
previous.next =listNode.next;
}
else{
hashtable.put(listNode.data,true);
previous =listNode;
}
listNode = listNode.next;
}
//listNode is null
}
while循环执行到最后一个Node(listNode!=null)
因此,在最后一次迭代中,listNode.next将为null,并将其分配给listNode。
在调用removeLinkListNodeDuplication(linkList);
之前,linkList是指第一个Object的地址。
内部removeLinkListNodeDuplication(linkList);在最后一次迭代中,listNode指的是最后一个Node,您将该Node设为Null。它不会修改以前的节点。
因此,在执行removeLinkListNodeDuplication(linkList);
之后,linkList仍然引用未修改的firstNode。在removeLinkListNodeDuplication执行过程中唯一修改的是从firstNode到nextNode的链接,该链接在跳过重复节点后现在指向lastNode。请检查代码片段中的注释,该代码片段对其进行了详细解释。
Node linkList =new Node(1); // linkList now Points to 1stNode
linkList.appendToTail(1); // linkList still points to 1stNode - add a link inside 1st Node to 2nd Node
linkList.appendToTail(1); // linkList still points to 1stNode - add a link inside 2st Node to 3rd Node
linkList.appendToTail(2); // linkList still points to 1stNode - add a link inside 3rd Node to 4th Node
DateTest dt = new DateTest();
dt.removeLinkListNodeDuplication(linkList);
//linkList still points to 1stNode - but the link is now modified from 2ndNode to 4thNode
public void removeLinkListNodeDuplication(Node listNode) {
Node previous =null;
Hashtable<Integer,Boolean> hashtable=new Hashtable<Integer, Boolean>();
while (listNode!=null){
if(hashtable.containsKey(listNode.data)){
previous.next =listNode.next;
// 2nd Iteration - previous points to 1stNode - modify link inside 1stNode to 3rd Node
// 3rd Iteration - previous points to 1stNode - modify link inside 1stNode to 4th Node
}
else{
hashtable.put(listNode.data,true);
previous =listNode;
//1st Iteration previous points to 1stNode
//4thIteration previous points to 4thNode
}
listNode = listNode.next;
//1st Iteration listNode points to 2ndNode
//2nd Iteration listNode points to 3rdNode
//3rd Iteration listNode points to 4thNode
//4th Iteration listNode points to Null
}
//listNode is null ?!
// listNode now points to Null
}
Hi方法中的链表是对其值由参数指定的对象的引用。
我想你说的是参考电话。
如果修改对象的内容。你可以在调用方法中得到它。
但是,如果修改引用本身,就无法在调用方法中得到它。