タイトルをleetcode86に変更します:分離されたリンクリストの解決策。
リンクリストと特定の値xが与えられた場合、x未満のすべてのノードがx以上のノードの前になるようにリンクリストを分割します。
2つのパーティションの各ノードの初期相対位置を維持する必要があります。
例:
入力:ヘッド= 1-> 4-> 3-> 2-> 5-> 2、x = 3
出力:1-> 2-> 2-> 4-> 3-> 5
コードのアイデアは、リンクリストを最初と後に2つのリンクリストに逆アセンブルし、次に2つのリンクリストを再度接続することです。コードを書いたとき、リンク後の最後のノードのポインターを設定しませんでしたリストがnullになり、この時点でアドレスのheap-use-after-freeでエラーが報告されました。この文を追加した後-> next = nullptr;合格したので、Baidu。
Baiduは後で発見しました:ブログは非常に理にかなっています
。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;
}
};