0

由于我没有机器来测试这个,我在这里需要你的帮助。

  • 如果我分配L.head = NULLL因为没有而变得空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 中,则列表为空。

4

4 回答 4

0

你想这个太难了。当没有对它的字符串引用时,对象变为可收集的。

在您的示例中,当您不再有对该对象的任何引用时,它变得可收集。没有比这更复杂的了。

于 2012-10-06T13:59:39.570 回答
0

(在下面的文本中,“reachable”是“reachable if IntSLListobject is reachable”的简写。)

如果我分配 L.head = NULL , L 会因为没有 head 而变空吗?

这取决于您的链表的定义。您的图表包含一个尾指针,因此除非对该尾指针进行更新,否则最后一个元素将保持可访问(因此不会被垃圾收集)。但是由于其他节点无法从最后一个节点访问,它们可能(假设没有其他对它们的引用)变得无法访问,因此有资格进行垃圾收集。

如果我分配 L.head = L.next.next(3rd node) 前两个节点将作为垃圾收集器(假设使用 Java)对吗?

是的,出于同样的原因,仍然假设没有其他对这两个节点的引用。

一个方法 void cutToNumber(IntSLList L, int n) 从头开始​​切割一个整数单链表 L,直到它到达整数 n。如果 n 不在 L 中,则列表为空。

和以前一样,尾部保持不变,因此至少最后一个节点将保持可达,尽管所有其他节点可能变得不可达。

请注意,您的代码包含一个错误,条件应包含逻辑和,而不是逻辑或,以在到达结尾时正确停止(现在,它将评估第二个条件,如果tmp == null并且您将从该tmp.into位获得 NPE) . 当然,没有头部但有尾部的列表非常令人困惑(我敢说这是一个错误)。

于 2012-10-06T14:00:24.230 回答
0
  1. 在你的循环中它应该是&&运算符而不是||,否则它总是只会在链接的末尾停止。

  2. nint,所以你必须使用==\!=运算符来与其他比较int

该方法应该类似于:

void cutToInteger (IntSLList L , int n){    
    IntSLList tmp =L.head;
    while( tmp != NULL && tmp.into != n ){
         tmp=tmp.next;
    }
    L.head = tmp;
}
于 2012-10-06T14:02:27.353 回答
0

看看 java.util.LinkedList - 它似乎做同样的事情。

1)正确!由于头指针不指向任何内容(空指针),因此您的列表应被视为“空”并且应返回 size=0。

2)垃圾收集器很聪明。由于在您的“剪切”之后没有人指向 (5),因此对象 5 可用于收集,接下来有 ​​8 个可用,然后是 4,然后是 12。收集器可能会立即发现它们。实际收集的顺序和时间取决于收集器的实现(在短/小程序中,收集器甚至可能根本不运行)。

于 2012-10-06T14:04:49.547 回答