未満の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
}
};