&引用;通告";Java中的对象参数

&引用;通告";Java中的对象参数,java,algorithm,linked-list,Java,Algorithm,Linked List,假设给我一个带有定义的链表(Java) public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } 我得到了链接列表的一个实例: 1->2->3->4 在下面的函数中,我可以访问值为3的节点,即3 public void remove (ListNode node){ node = node.next; } 链表是否变为1->2->4 我试图将

假设给我一个带有定义的链表(Java)

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}
我得到了链接列表的一个实例:

1->2->3->4
在下面的函数中,我可以访问值为3的节点,即
3

public void remove (ListNode node){
    node = node.next;
}
链表是否变为
1->2->4

我试图将此解决方案提交给在线法官,但没有任何效果。帮忙

public void remove (ListNode node){
    node = node.next;
}
这只会影响您当前持有的本地引用。要删除节点,必须操作其前一个节点的
next
变量,该变量不可用,因为它是一个单链表

理论上你所能做的就是:

public void removeNext (ListNode node) {
    node.next = node.next.next;
}

在示例列表上调用此方法时,必须分别使用值为2的节点。

Java参数是通过值传递的

调用
remove
时,将传入对
节点的引用副本。您的代码试图通过设置
node=node.next()
本地更改此引用,但这不会影响原始列表

remove
方法需要做的是在列表中找到节点,该节点有一个
next
,该节点指向要删除的节点,并将其更改为指向要删除的节点之后的节点。假设有一个方法可以找到一个名为
findParentOf()
的给定节点的父节点:

它什么也不做,因为当本地引用变量
node
设置为
node.next
时,它从指向val为3的节点转到val为4的节点

      ||
      \/    
1->2->3->4
变成

         ||
         \/
1->2->3->4

您当前的输出是什么?@Omore,
1->2->3->4
,没有更改任何内容。因为您只是更改了参数变量的值,而不是任何对象的任何字段。不过传入了一个引用,因此它应该会对原始内容进行修改。我想我不应该看到您在说什么。当我们说
node=node时,我们所要做的就是改变节点指向的是什么?正确吗?@fasasa传递了引用的副本。如果将本地副本设置为引用另一个节点,则不会更改原始列表。是的,传入了引用,但您没有修改引用的对象-您正在更改引用本身的值。也就是说,你让它指向一个不同的对象,而实际上没有改变任何对象。
      ||
      \/    
1->2->3->4
         ||
         \/
1->2->3->4