仅在单个链表中给链表指定了要删除的节点的指针(删除代码差)?

时间:2018-11-19 07:36:34

标签: java pointers data-structures linked-list

完成我的待办事项之后
我知道解决方法如下

public void deleteNode(Node node) { 
    node.data = (node.next).data; 
    node.next = (node.next).next; 

    System.gc(); 
} 

但是我的问题是

以上解决方案与下一个解决方案有何不同
两者都是有效的解决方案,是否具有相同的功能

public void deleteNode(Node node) { 
    node = (node.next); 

    System.gc(); 
}

2 个答案:

答案 0 :(得分:1)

这样做的时候

node = (node.next); 

您更改参数,但不更改任何数据。

Java使用按值调用方法(很难理解按值传递引用的含义)。

这是个小例子:

void foo(int i) {
    i = 2;
    System.out.println(i);
} 

我们称之为

int j = 1;
foo(j);
System.out.println(j);

我们在控制台上获得了21。 这意味着在调用foo时传递给它的值的副本。

PS:

您不需要致电System.gc();

答案 1 :(得分:0)

感谢@talex

我将案件可视化为更清晰的
让我们假设要从链接列表中删除以下node c的问题
而且我们只能访问该节点
enter image description here

第一个解决方案实际上将删除节点

public void deleteNode(Node node) { 
    node.data = (node.next).data; 
    node.next = (node.next).next; 

    System.gc(); 
} 

通过将下一个单元格(值和指针)复制到参数单元格
所以最终结果
参数单元格将被视为已删除,并且链接列表将正确链接
提示:

  • node d不会被任何指针GC清除
  • 如果我们需要删除最后一个单元格,则此解决方案将无效

enter image description here

第二个解决方案不会删除节点

public void deleteNode(Node node) { 
    node = (node.next); 

    System.gc(); 
}

那是因为它只能更改参数单元格的指针
所以最终结果
参数单元格将不会被删除,并且“链接列表”仍具有该单元格 enter image description here