链接列表,递归后退

时间:2016-03-22 16:21:58

标签: java recursion linked-list

我有一个简单的任务,我似乎无法弄明白。这个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的方法。

2 个答案:

答案 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)。那将是前一个节点的位置。将其添加到列表中。

继续这样做,直到你回到原点。

我不喜欢检查nextnull)采取行动(可以这么说)。我喜欢使用空节点作为基本情况。所以,我的看起来像这样:

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. 确保存在递归停止和放松的状态。
  2. 确保递归直到停止。
  3. 确保最终达到状态1
  4. 您违反了规则13

    显然你违反了规则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.
        }
    

    即。当你检测到结束时,确保该方法不会做任何事情(或者是微不足道的事情) - 不要再次递归。