力扣刷題對heap-use-after-free on address錯誤原因之一猜想

Am最溫柔發表於2020-10-04

改題目是leetcode86:分隔連結串列的題解。
給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置。

示例:

輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5

程式碼的思路是將一個連結串列拆解成兩個連結串列begin和after,然後將兩個連結串列再連線起來,我在寫程式碼的時候,沒有將after連結串列的最後一個節點的指標置為空,此時報錯heap-use-after-free on address。加入了這句話after->next = nullptr;就通過了,因此百度一下。

百度之後發現:一篇部落格說的很有道理
為什麼連結串列的最後一個(尾節點)如果沒有rear->next=NULL;這個連結串列就會錯呢?
我來告訴你為什麼!
這個錯誤你已近犯了很多次,告訴你以後就不要在犯錯了
如果在單向連結串列中,最後一個節點沒有明確的指向的話
計算機既認為這個連結串列是沒有建立完全的,它是不會停止的。
所以我們在建造連結串列時一定要牢記,最後一個節點一定要有所指向
是頭結點形成迴圈連結串列也好,指向一個NULL值也好。
總而言之是不可以空著的!
記住了!

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
		ListNode* before = new ListNode(0);
		ListNode* before_head = before;
		ListNode* after = new ListNode(0);
		ListNode* after_head = after;
		
		while(head){
			if(head->val<x){
				before->next = head;
				before = before->next;
			}
			else{
				after->next = head;
				after = after->next;
			}
			head = head->next;
		}
		//該行如果不加會報錯heap-use-after-free
		after->next = nullptr;
		before->next = after_head->next;
		return before_head->next;
		
    }
};

相關文章