Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

รายการพาร์ติชั่นใน C++


สมมติว่าเรามีรายการที่เชื่อมโยงและค่า x เราต้องทำพาร์ทิชั่น พาร์ติชั่นมันเพื่อให้โหนดทั้งหมดที่น้อยกว่า x มาก่อนโหนดที่มากกว่าหรือเท่ากับ x เราควรรักษาลำดับสัมพัทธ์ดั้งเดิมของโหนดในแต่ละพาร์ติชั่นทั้งสองนี้ ดังนั้นหากรายการเป็นแบบ [1,4,3,2,5,2] และ x =3 ผลลัพธ์จะเป็น [1,2,2,4,3,5]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างโหนดจำลอง d1 และ d2 และเริ่มต้นด้วย -1 สร้างพอยน์เตอร์สองตัว dp1 และ dp2 ชี้ไปที่ d1 และ d2 ตามลำดับ
  • ในขณะที่ a ไม่เป็นโมฆะ
    • ถ้าค่าของ
    • ถัดไปของ dp1 :=โหนดใหม่ที่มีค่า a
    • dp1 :=ตัวชี้ถัดไปของ dp1
  • อย่างอื่น
    • ถัดไปของ dp2 :=โหนดใหม่ที่มีค่า a
    • dp2 :=ตัวชี้ถัดไปของ dp2
  • a :=ถัดจาก a
  • ถัดไปของ dp1 :=ถัดไปของ d2
  • กลับรายการถัดไปของ d1
  • ตัวอย่าง(C++)

    ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −

    #include <bits/stdc++.h>
    using namespace std;
    class ListNode{
       public:
          int val;
          ListNode *next;
          ListNode(int data){
             val = data;
             next = NULL;
          }
    };
    ListNode *make_list(vector<int> v){
       ListNode *head = new ListNode(v[0]);
       for(int i = 1; i<v.size(); i++){
          ListNode *ptr = head;
          while(ptr->next != NULL){
             ptr = ptr->next;
          }
          ptr->next = new ListNode(v[i]);
       }
       return head;
    }
    void print_list(ListNode *head){
       ListNode *ptr = head;
       cout << "[";
       while(ptr->next){
          cout << ptr->val << ", ";
          ptr = ptr->next;
       }
       cout << "]" << endl;
    }
    class Solution {
    public:
       ListNode* partition(ListNode* a, int b) {
          ListNode* dummy1 = new ListNode(-1);
          ListNode* dummy2 = new ListNode(-1);
          ListNode* dummyPtr1 = dummy1;
          ListNode* dummyPtr2 = dummy2;
          while(a){
             if(a->val < b){
                dummyPtr1->next = new ListNode(a->val);
                dummyPtr1 = dummyPtr1->next;
             }
             else{
                dummyPtr2->next = new ListNode(a->val);
                dummyPtr2 = dummyPtr2->next;
             }
             a = a->next;
          }
          dummyPtr1->next = dummy2->next;
          return dummy1->next;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,4,6,3,2,5,2,8};
       ListNode *head = make_list(v);
       print_list(ob.partition(head, 3));
    }

    อินพุต

    [1,4,6,3,2,5,2,8]
    3

    ผลลัพธ์

    [1, 2, 2, 4, 6, 3, 5, ]