"环形" Java中的对象参数

时间:2017-04-12 23:54:35

标签: 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吗?

我尝试将此解决方案提交给在线评委,但它没有做任何事情。帮助

3 个答案:

答案 0 :(得分:1)

Java参数为passed by value

当您致电remove时,会传递node引用的副本。您的代码会尝试通过设置node = node.next()在本地更改此引用,但这不会成功影响原始列表。

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

ListNode parentNode = findParentOf(nodeToRemove);
parentNode.next = nodeToRemove.next;

答案 1 :(得分:0)

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

这只会影响您当前持有的本地参考。要删除节点,您必须操纵其前任的next变量,该变量不可用,因为它是单链接列表。

理论上你所能做的就是:

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

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

答案 2 :(得分:0)

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

它没有做任何事情,因为当本地引用变量node设置为node.next时,它会从指向val为3的节点转到val为4的节点。

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

变为

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