问题来自Leetcode。
“给定链表和值x,对其进行分区,使得小于x的所有节点都在节点大于或等于x之前。 您应该保留两个分区中每个节点的原始相对顺序。“
我的问题是,为什么我们必须有“right.next = null”这一行。如果我没有在LinkedList的末尾添加NULL,为什么它会给出“内存限制超出错误”? 提前谢谢!
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;
}
答案 0 :(得分:1)
嗯,你有两个指针,左右,你正在构建分区。它们总是指向相应分区的最后一个元素。 leftDummy和rightDummy是这些分区的开头。因此,最后您应该将左侧分区的最后一个元素附加到右侧分区的第一个元素:
left.next = rightDummy.next;
如果右侧分区的最后一个元素用于指向原始列表中的其他元素,则应该更正,否则可以获得无限循环:
right.next = null;
以下是一个例子:
您的清单:1 - &gt; 5 - &gt; 8 - &gt; 2 在x = 4的情况下,最终得到两个分区:
leftDummy = 1 -> 2 = left
rightDummy = 5 -> 8 = right
但是在原始列表中,包含8(现在称为右)的元素指向2,因此如果您尝试迭代新列表1 - &gt; 2 - &gt; 5 - &gt; 8,你真的得到:
1 -> 2 -> 5 -> 8 -> 2 -> 5 -> 8 -> 2.....
所以,你必须删除对&#34; next&#34;的引用。正确变量中的元素。