[英]Why am i entering into an infinite loop when partitioning a linked list?
这是将链表分成两部分的常见问题。 节点小于 x 的列表将排在前面,节点大于 x 的列表将排在后面。
我的问题是 - 为什么我需要在创建两个单独的链表后将 after.next 设置为 null? 如果不将其设置为 null,我会在尝试打印此列表时进入无限循环。 我的调试器显示 before_head.next 有一个永无止境的节点列表附加到它......
public Node partition(Node head, int x){
Node before_head=new Node(0);
Node before=before_head;
Node after_head=new Node(0);
Node after=after_head;
while(head != null){
if(head.val < x){
before.next=head;
before=before.next;
else{
after.next=head;
after=after.next;
}
head=head.next;
}
after.next=null;
before.next=after_head;
return before_head.next;
}
为什么我需要在创建两个单独的链表后将 after.next 设置为 null?
链表的最后一个节点没有下一个节点。 在像您这样的链表表示中,最后一个节点的next
引用形式为 null。
您正在通过更改它们的next
引用来重新排列列表的现有节点。 在该过程结束时, after
是对最后一个节点的引用,因此它的next
引用需要是 null。如果它也是原始顺序中的最后一个节点,那么一切都很好——它的next
引用已经是 null。如果after
不是原始顺序中的最后一个节点,但是, after.next
将引用其他节点之一,直到您将其设置为 null。无论其他节点是什么,它都会在新顺序中出现在after
之前,形成一个循环.
还要注意的是
before.next=after_head;
似乎是错误的。 after_head
是第二个分区的虚拟头节点,因此您不想将其包含在新列表中。 我想你想要
before.next = after_head.next;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.