我将LinkedListNode发送到方法(removeLinkListNodeDuplication)以删除重复条目。它遍历LinkedListNode并在Hashtable的帮助下找到重复的值。
我想知道为什么我的LinkedListNode的实例在我的删除方法结束时为空(removeLinkListNodeDuplication),但是在我的删除方法出来后它改变了我的期望。
这是我的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;
}
}
在下面我创建了上面一个类的实例并将其传递给我的删除方法。
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
}
答案 0 :(得分:1)
执行while循环直到最后一个Node(listNode!= null)
因此,对于最后一次迭代,listNode.next将为null,并且将相同的内容分配给listNode。
在调用removeLinkListNodeDuplication(linkList);
之前,linkList指的是第一个Object的地址。
inside removeLinkListNodeDuplication(linkList);在最后一次迭代中,listNode引用最后一个Node,并且您将该Node设置为Null。它不会修改以前的节点。
因此,在执行removeLinkListNodeDuplication(linkList);
之后,linkList仍然引用未修改的firstNode。只有在removeLinkListNodeDuplication exectuion期间修改的东西是从firstNode到nextNode的链接,nextNode现在在跳过duplicateNode后指向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
}
答案 1 :(得分:0)
方法中的linklist是对参数赋值的对象的引用。
我认为您正在谈论通过引用打电话。
如果修改对象的内容。你可以在调用方法中得到它。
但是如果你修改引用本身就不能在调用方法中得到它。