【发布时间】:2016-07-17 19:20:14
【问题描述】:
我今天正在练习我的编码技巧,今天解决了“从链表中删除某个值的所有元素”的问题。我想出的解决方案是
public void RemoveAll ( T val )
{
if(_root == null)
return;
if(_root.Value == val)
{
_root = _root.Next;
RemoveAll(val);
}
Node last = _root,
cur = _root.Next;
while(cur != null)
{
if(cur.Value == val)
last.Next = cur.Next;
else
last = cur;
cur = cur.Next;
}
}
这是我的问题:
当cur.Value == val 我正在做一些事情,比如从
A -> B -> C
到
A -> C
编译器或运行时环境是否会看到B 不再使用并丢弃它?还是我应该明确地这样做?
我有第二个问题,即调用堆栈是否会因递归 void 方法而爆炸。正如您在此处看到的,该方法有可能会调用自身。但是既然它是一个不返回值的方法,那么运行时环境不能只是擦除关于最后一次调用的数据吗?它没有理由留在记忆中(对吧?)。
【问题讨论】:
-
应该最终...
-
你会如何明确地做到这一点?
B=null还是什么?但是 B 只是指向 null 并且对象仍在内存中。 -
当然,它将被收集,而不是丢弃。而且你迟早会炸毁堆栈,考虑一下 while (_root != null && _root.Value == val) _root = _root.Next;