簡體   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