当单个链接列表节点成为垃圾数据?

时间:2012-10-06 13:39:09

标签: java data-structures garbage-collection linked-list

由于我没有机器来测试这个,所以我非常需要你的帮助。

  • 如果我指定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;
}

实现看起来很简单但是节点成为垃圾数据的逻辑总是让我感到困惑。

enter image description here

更新:以下是上述截图的问题

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

4 个答案:

答案 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)

    在循环中
  1. 它应该是&&运算符而不是||,否则它将始终仅在链接的末尾停止。

  2. nint,因此您必须使用==\!=运算符将其与其他int进行比较。

  3. 该方法应该是这样的:

    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.收集器可以立即发现它们。实际收集的顺序和时间取决于收集器实现(在一个简短的/小程序中,收集器可能根本不运行)。