【问题标题】:When a Single Linked List Node becomes a Garbage Data?当单链表节点变成垃圾数据?
【发布时间】:2012-10-06 22:04:49
【问题描述】:

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

  • 如果我分配L.head = NULLL 会变空,因为有 没有head

  • 如果我分配L.head = L.next.next(3rd node) 前两个节点 将作为垃圾收集器(假设使用 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 中,则列表为空。

【问题讨论】:

  • 我认为我写的方法有错误。 tmp 应该复制列表 L
  • 回答你的前两个问题:是的,我相信是这样,因为现在没有任何东西引用头节点,因此它变成了垃圾收集。第二个问题的类似概念。
  • 我认为 while 循环应该是 while(tmp->next != NULL || !tmp.into.equals(n))

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


【解决方案1】:
  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;
}

【讨论】:

  • 那么,尾部之后的下一个节点将是NULL,对吗? tmp=tmp.next (其中 tmp 当前是尾部)然后是 L.head = tmp 它是 NULL 。它将清空整个列表L 对吗? into之前没用过。
【解决方案2】:

(在下面的文本中,“reachable”是“如果IntSLList 对象可访问,则可达”的简写。)

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

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-06-16
        • 2019-07-28
        • 2023-03-26
        • 2012-01-18
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        相关资源
        最近更新 更多