这是将链表划分为两部分的常见问题。节点小于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
引用已经为空。但是,如果after
不是原始顺序中的最后一个节点,则after.next
将引用其他节点之一,直到将其设置为null。无论其他节点是什么,它都以新的顺序出现在after
之前,形成一个循环。
同时注意
before.next=after_head;
似乎是错误的。after_head
是第二个分区的伪头节点,因此您不希望将其包含在新列表中。我想你想要
before.next = after_head.next;