我有一个简单的任务,我似乎无法弄明白。这个prebuild函数我必须使用给我的骨架函数将此列表按相反的顺序排列(不允许更改它返回的内容及其参数)。
//----------- helper function
/**
* cursedReverse( DataNode )
* recursively chase list until get to the end.
* create new list at the end of the recursion, return
* add nodes to the returned list at the end of the list
* since you're coming back up, the end will be reversed.
* @param node DataNode
* @return DataList
*/
public static DataList cursedReverse( DataNode node )
{
//////////////////////////////////////////////////////////////
// 4. traverse "list", recursively
//++++++++++++++++++++++++++
/*
while( node.next() != null ){
System.out.println("Going down list recursively " + node.data().value );
return cursedReverse( node.next() );
}
if( node.next() == null ){
System.out.println("At end of the list " + node.data().value );
// cursedReverse( node );
//return temp
}
*/
DataList d1 = cursedReverse( node );
if( node.next() == null ) {
System.out.println(" We have Reached the end of the list ");
} else if( node != null ){
System.out.println("NOT NULL");
}
// DataList remaining = cursedReverse( node.next() );
return null;
}
我知道如何递归地完成列表的按钮。但它是一个单向链表,这意味着我只能说node.next()在下来的路上获得下一个列表。所以我无法想出一种向后推进DataList的方法。
答案 0 :(得分:3)
但它是一个单向链表,意思是我只能说node.next()为 在下来的路上得到下一个清单。所以我想不出办法 向后推送DataList。
它不需要双重联系。递归将允许您在堆栈展开时以相反的顺序访问它。
在进行递归调用时,您将逐个节点地(使用TRANSFORM Sum([StatusTracking Query].CountOfProjectID) AS SumOfCountOfProjectID
SELECT [StatusTracking Query].Category As ArgField1
FROM [StatusTracking Query]
GROUP BY [StatusTracking Query].Category
PIVOT [StatusTracking Query].ValueDate;
)向下到列表,直到到达最后一个节点(列表的末尾)。
到达终点后,您将开始向反转列表添加节点(现在您的最后一个节点成为该列表中的第一个节点)。
每次通话结束后,您将返回上一次通话(您通过的next
)。那将是前一个节点的位置。将其添加到列表中。
继续这样做,直到你回到原点。
我不喜欢检查next
(null
)采取行动(可以这么说)。我喜欢使用空节点作为基本情况。所以,我的看起来像这样:
if(node != null) {...}
第一个电话应该是public static DataList cursedReverse( DataNode node ) {
if (node == null)
return new DataList();
DataList dl = cursedReverse(node.next());
dl.add(node);
return dl;
}
。
答案 1 :(得分:2)
此:
DataList d1 = cursedReverse( node );
显然是错误的。输入cursedReverse
时您要做的第一件事就是致电cursedReverse
。那就是StackOverflow
。
递归有点像归纳证明。它有三个主要部分。
1
。您违反了规则1
和3
。
显然你违反了规则1
。
您没有将不同的参数传递给3
,从而违反了规则cursedReverse
。这样的事情可能是一个很好的方向。
DataList d1 = cursedReverse( node.next() );
要修复1
,您需要执行以下操作:
if (node != null) {
if (node.next() != null) {
DataList reversed = cursedReverse(node.next());
...
} else {
// Last in the list.
}
} else {
// Null node! Hit the end.
}
即。当你检测到结束时,确保该方法不会做任何事情(或者是微不足道的事情) - 不要再次递归。