java LinkedList删除给了我不同的值



我正在将一个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方法中的链表是对其值由参数指定的对象的引用。

我想你说的是参考电话。

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

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

相关内容

  • 没有找到相关文章

最新更新