java LinkedList删除给了我不同的值

时间:2014-08-26 08:32:56

标签: java linked-list

我将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 

}

2 个答案:

答案 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是对参数赋值的对象的引用。

我认为您正在谈论通过引用打电话。

如果修改对象的内容。你可以在调用方法中得到它。

但是如果你修改引用本身就不能在调用方法中得到它。

相关问题