【问题标题】:Reverse linked list from header node?从头节点反向链表?
【发布时间】:2016-07-09 14:28:04
【问题描述】:

我在网上到处都能看到从尾巴开始的程序

这里的节点是头节点

reverseNode(int node){

    if(node==null){
        return;
    }

    reverseNode(node.next);

    Node temp = node.next;
    node.next = node.prev;
    node.prev=temp;

    if(node.prev==null){
        headNode = node;
    }
}

但我可以想到可以从标头节点反转的方法,例如

这里的节点是头节点

reverseNode(int node){

    if(node==null){
        return;
    }

    Node temp = node.next;
    node.next = node.prev;
    node.prev=temp;


    reverseNode(node.prev);

   if(node.prev==null){
       headNode = node;
   }
}

但我没有看到任何地方提到的方法。这种方法是否有任何错误/问题或未优化?

【问题讨论】:

    标签: java algorithm linked-list


    【解决方案1】:

    第一个版本是head recursion 的示例。第二个是tail recursion 的例子。这里有很好的解释:The difference between head & tail recursion.

    【讨论】:

    • 所以我的第二种方法在反转链表的情况下很好
    • 是的,您的方法有效,并且一般来说,在空间方面比头递归更有效,因为它的功能更像一个循环(调用堆栈上弹出的状态较少,因为批量的工作在递归步骤之前完成)。
    • @Soggiorno 除了 Java 没有将尾递归实现为循环,因此头递归与尾递归没有区别。见Why doesn't Java have optimization for tail-recursion at all?
    • @Andreas 没错,在 Java 中它没有任何区别,因为 Java 不支持尾递归。但是,在支持此功能的其他语言中,它可能会有所作为。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2022-11-16
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多