【问题标题】:Reverse Linked List recursively, why it is wrong递归反向链表,为什么会出错
【发布时间】:2015-06-23 00:40:19
【问题描述】:

问题:递归地反转单链表。

我知道如何解决这个问题,但是我的递归方法之一是错误的,我无法弄清楚这段代码有什么问题。有人能弄清楚吗?非常感谢!

测试用例: 输入: [1,2,3] 输出: [3,1] 预期的: [3,2,1]

public class Solution {
    // recursive
    ListNode last = null;
    public ListNode reverseList(ListNode head) {
        if (head == null)   return null;
        helper(head);
        return last;
    }
    private ListNode helper(ListNode head) {
        // base case
        if (head.next == null)  {  
            last = head;
            return head;
        }
        // general case
        ListNode prev = reverseList(head.next);  // should be ListNode prev = helper(head.next);
        prev.next = head;
        head.next = null;
        return head;
    }
}

【问题讨论】:

  • 为您使用的编程语言添加标签会很有帮助。
  • 在递归函数中使用“全局”(最后一个)通常是一个不好的迹象。
  • 另一个不好的迹象是,您从 helper 方法中返回了一些东西,而 reverseList 中没有使用它...
  • 谢谢大家!我太粗心了,写错了方法名。但是为什么在递归中使用全局变量不好呢?

标签: recursion


【解决方案1】:

它不起作用,因为在helper方法的第一遍

ListNode prev = reverseList(head.next);

返回 [3, 2],然后将旧的 head (1) 分配为反向列表 (3) 的新头之后的下一个节点。因此,最终结果是 [3, 1]。

【讨论】:

  • 非常感谢,我知道由于我的粗心,我犯了错误。我更注重逻辑,但不太注重我的写作。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 2013-03-04
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多