[リスト]パーティション・リスト

未満のxノードは(安定性を確保するため)に、フロントにルーティングされるように、あなたに単一のリストと、xの数を得ました。

一般的な考え方:

最初に、私は、まず、第1> X =ノードを検索し、次に再びバッキングプラグを横断し、考慮すべき要因の特に多数を発見しただけでなく、頭を考慮し、その質問ヘッド補間法に「逆リスト」のような考えノードすること質問が議論されるように、ヘッドを挿入する> = Xであり、そしてそのような。いい曲書き込みコードの後、見つけます。

そして、この方法を考えることは本当に完全に少しの支援のためのスペースがありません。なぜ補助スペースを行いますか?また、実際には、リストのために、ポインタをリセットするだけで新しい「リストのヘッドノード」場合、実際には、補助スペースを使用していませんでした!簡単な方法はありますか?

その後。私はヒットをとっています。原稿は、限りすべて= Xノード<全てdummy2に接続され、Xノードの>、次いでdummy1に接続されたスプライスさ行に(注最終スプライスすなわち、最終的な結果のリスト- >次= NULL)

ACコード:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        //判空+一个
        if(head==NULL)
            return head;
        if(head->next==NULL)
            return head;
        
        ListNode *dummy1 =new ListNode(0); //存前面的<x的结点
        ListNode *dummy2 =new ListNode(0); //存后面的>=x的结点
        ListNode *cur1 = dummy1;
        ListNode *cur2 = dummy2;
        
        //不需要先找到第一个>=x的结点!直接去把>=x的连起来,把<x的连起来
        ListNode *p = head;
        while(p)
        {
            if(p->val<x)
            {
                cur1->next = p;
                cur1 = cur1->next;
            }
            else
            {
                cur2->next = p;
                cur2 = cur2->next;
            }
            p = p->next;
        }
        //拼接
        cur1->next = dummy2->next;
        cur2->next = NULL;//末尾->next要指向空才行。如果原链表最后一个结点不是>=x的,则不会next==NULL
        return dummy1->next; //注意,dummy是无意义的头结点,要返回->next
    }
};

 

おすすめ

転載: blog.csdn.net/m0_38033475/article/details/92422259