【问题标题】:LinkedList memory limit exceeded超出 LinkedList 内存限制
【发布时间】:2016-11-07 20:21:21
【问题描述】:

问题来自 Leetcode。

“给定一个链表和一个值 x,对它进行分区,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 您应该保留两个分区中每个分区中节点的原始相对顺序。”

我的问题是,为什么我们必须有“right.next = null”这一行。如果我不将 NULL 放在 LinkedList 的末尾,为什么它会给出“超出内存限制错误”? 提前致谢!

    public ListNode partition (ListNode head, int x) {
        if (head==null) return head;
        ListNode leftDummy = new ListNode(0);
        ListNode rightDummy = new ListNode(0);
        ListNode left = leftDummy;
        ListNode right = rightDummy;

        while (head!=null) {
            if (head.val < x) {
                left.next = head;
                left = head;
            } else {
                right.next = head;
                right = head;
            }
            head = head.next;
        }
        // merge the two
        right.next = null;     // WHY THIS LINE??
        left.next = rightDummy.next;
        return leftDummy.next;
    }

【问题讨论】:

  • 如果你没有对原始列表进行分区,所以我的猜测是当你合并它们时,你正在创建 N^2 的节点数。这就是使用调试器有助于解释您做得更好的地方。

标签: java memory-leaks linked-list


【解决方案1】:

嗯,你有两个指针,左右你正在构建分区。它们始终指向相应分区的最后一个元素。 leftDummy 和 rightDummy 是这些分区的开始。所以,最后你应该将左分区的最后一个元素附加到右分区的第一个元素:

left.next = rightDummy.next;

如果右分区的最后一个元素曾经指向原始列表中的某个其他元素,你应该纠正它,否则你会得到一个无限循环:

right.next = null;

这是一个例子:

你的名单:1 -> 5 -> 8 -> 2 x = 4,最终得到两个分区:

leftDummy = 1 -> 2 = left
rightDummy = 5 -> 8 = right

但是在原始列表中,包含 8 的元素(现在称为右)指向 2,因此如果您尝试迭代新列表 1 -> 2 -> 5 -> 8,您实际上会得到:

1 -> 2 -> 5 -> 8 -> 2 -> 5 -> 8 -> 2.....

因此,您必须删除对右侧变量中“下一个”元素的引用。

【讨论】:

  • 但是,即使我们有一个带圆圈的链表,这里也没有内存泄漏。带圆圈的列表并不意味着我们将它们无限次地保存在内存中。所以还是很疑惑为什么会有内存限制超出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2019-11-07
  • 2012-05-05
相关资源
最近更新 更多