2012-10-06 35 views
0

因为我没有机器来测试这个,所以我需要你的帮助。单个链接列表节点成为垃圾数据时?

  • 如果我给你L.head = NULLL变空,因为有 没有head

  • 如果我给你L.head = L.next.next(第3点)之前的两个节点 将作为垃圾收集器(假设使用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

UPDATE:这里是上面的截图

的方法空隙cutToNumber(IntSLList L,INT N),削减的整数单链接列表L从头部开始,直到它到达问题整数n。如果n不在L中,则列表变为空。

+0

我认为我写的方法有错误。 'tmp'应该复制'L'列表。 – Sobiaholic

+0

回答你的前两个问题:是的,我相信是这样,因为现在什么都没有引用头节点,因此它变成垃圾收集。第二个问题的类似概念。 – Clark

+0

我认为while循环应该是while(tmp-> next!= NULL ||!tmp.into.equals(n)) – rbhawsar

回答

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; 
} 
+0

那么,尾部后面的下一个节点将会是NULL? 'tmp = tmp.next'(其中tmp当前是尾部),然后是'Lhead = tmp',它是NULL。它会清空整个“L”列表是否正确? “变成”我以前从未使用过它。 – Sobiaholic

+0

是的,最后一个节点的'next'应该是'null',它将清空列表。 –

+0

现在很清楚!谢谢先生! – Sobiaholic

0

你正在考虑这个太难了。当没有字符串引用时,对象变为可收集。

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

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,您将得到一个NPE从tmp.into位)。当然,没有头部但尾部的列表很混乱(我敢说这是一个错误)。

0

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

1)正确!由于头指针指向无(空指针),因此您的列表应被视为“空”,并应返回大小= 0。

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