繁体   English   中英

为什么在划分链表时会进入无限循环?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM