由于我没有机器来测试这个,所以我非常需要你的帮助。
如果我指定L.head = NULL
,L
会因为存在而变空
没有head
?
如果我为前两个节点分配L.head = L.next.next
(第三个节点)
将作为垃圾收集器(假设使用Java)正确吗?
我为下面的照片编写方法cutToInteger
的尝试如下,如果我错了,请更正:
void cutToInteger (IntSLList L , int n){
IntSLList tmp =L.head ;
while( tmp != NULL || !tmp.into.equals(n)){
tmp=tmp.next;
}
L.head = tmp;
}
实现看起来很简单但是节点成为垃圾数据的逻辑总是让我感到困惑。
更新:以下是上述截图的问题
方法void cutToNumber(IntSLList L,int n),它从头开始剪切整数单链表L,直到达到整数n。如果n不在L中,则列表变为空。
答案 0 :(得分:0)
你正在考虑这个问题。当没有字符串引用时,对象变为可收集。
在您的示例中,当您不再具有对该对象的任何引用时,它将变为可收集。它并不复杂。
答案 1 :(得分:0)
(在下文中,“可达”是“如果可以访问IntSLList
对象,则可以到达”的简写。)
如果我指定L.head = NULL,L会变空,因为没有头?
这取决于您的链接列表的定义。您的图表包含一个尾指针,因此禁止更新该指针,最后一个元素将保持可访问状态(因此不会被垃圾回收)。但由于其他节点无法从最后一个节点到达,因此它们(假设没有其他节点引用)变得无法访问,因此有资格进行垃圾收集。
如果我指定L.head = L.next.next(第3个节点),前两个节点将作为垃圾收集器(假设使用Java)正确吗?
是的,通过相同的推理,仍然假设没有其他对这两个节点的引用。
方法void cutToNumber(IntSLList L,int n),它从头开始切割整数单链表L,直到达到整数n。如果n不在L中,则列表变空。
和以前一样,尾部保持不变,因此至少最后一个节点仍然可以访问,但所有其他节点可能无法访问。
请注意,您的代码包含一个错误,该条件应该包含逻辑,而不是逻辑或在到达目的时正确停止(现在,如果tmp == null
,您将评估第二个条件)我将从tmp.into
位获得一个NPE。当然,没有头但尾巴的列表非常令人困惑(我敢说这是一个错误)。
答案 2 :(得分:0)
它应该是&&
运算符而不是||
,否则它将始终仅在链接的末尾停止。
n
为int
,因此您必须使用==\!=
运算符将其与其他int
进行比较。
该方法应该是这样的:
void cutToInteger (IntSLList L , int n){
IntSLList tmp =L.head;
while( tmp != NULL && tmp.into != n ){
tmp=tmp.next;
}
L.head = tmp;
}
答案 3 :(得分:0)
看一下java.util.LinkedList - 它似乎做了同样的事情。
1)正确!由于头指针指向空(空指针),因此您的列表应被视为“空”并且应返回size = 0.
2)垃圾收集器很聪明。由于没有人在你的“剪切”之后指向(5),因此对象5可用于收集,其次是8,然后是4,然后是12.收集器可以立即发现它们。实际收集的顺序和时间取决于收集器实现(在一个简短的/小程序中,收集器可能根本不运行)。