【问题标题】:reverse double linked list using recursion使用递归的反向双链表
【发布时间】:2016-08-01 01:48:12
【问题描述】:

我正在编写程序来使用递归反转双链表。 我知道如何迭代地实现。但陷入递归。

这就是我所拥有的

public static Node reverseRecurseDoubleLinkedList(Node node){
        if (node==null || node.next==null)
            return node;
        Node newNode = reverseRecurseDoubleLinkedList(node.next);
        node.next.next=node;
        node.next=null;
        node.prev=newNode;
        return newNode;
    }

我看到prev 指针设置不正确。但next 指针实际上是正确的。

谢谢

【问题讨论】:

  • 可能与stackoverflow.com/questions/354875/…相同的问题
  • @DuyAnhPham:不,不是。我要求双链表,请先阅读问题。
  • 没有必要反转双头链接列表...您可以交换头部和尾部引用。
  • @Rugal:仅仅交换头部和尾部是不够的,因为每个节点的 nextprev 成员都不会正确设置。

标签: java algorithm recursion


【解决方案1】:

一般来说,简化递归代码思考的一种方法是仅考虑递归调用完成时提供的保证。然后,您需要检查这些保证是否适用于停止递归的基本情况(例如,空列表或具有单个节点的列表),并且它们在每个额外的递归调用中都得到维护。

提供的代码有几个问题:

  • 停止递归的条件没有正确处理node.next == null 时的情况。在这种情况下,node.prev 字段应该设置为 null

  • newNode 变量名可能会引起一些混淆。它代表反向列表的新头部(它是初始列表的尾部)。我将其重命名为newHead

  • 与上面的一点相关,node.prev=newNode;的赋值不正确——我们不希望每个节点的prev指向新链表的头部。

合并这些方面后,下面的代码正确地反转了列表:

public static Node reverseRecurseDoubleLinkedList(Node node) {
    if (node == null) {
        return node;
    }

    if (node.next == null) {
        node.prev = null;
        return node;
    }

    Node newHead = reverseRecurseDoubleLinkedList(node.next);
    node.next.next = node;
    node.prev = node.next;
    node.next = null;

    return newHead;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 2011-12-19
    • 2013-03-04
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多