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