Computer >> Máy Tính >  >> Lập trình >> C ++

Danh sách phân vùng trong C ++


Giả sử chúng ta có một danh sách liên kết và một giá trị x. Chúng ta phải làm các vách ngăn. Phân vùng sao cho tất cả các nút nhỏ hơn x đến trước các nút lớn hơn hoặc bằng x. Chúng ta nên bảo toàn thứ tự tương đối ban đầu của các nút trong mỗi phân vùng trong số hai phân vùng này. Vì vậy, nếu danh sách giống như [1,4,3,2,5,2] và x =3, thì đầu ra sẽ là [1,2,2,4,3,5]

Để giải quyết vấn đề này, chúng ta sẽ làm theo các bước sau -

  • Tạo các nút giả d1 và d2 và khởi tạo chúng bằng -1, tạo hai con trỏ dp1 và dp2, chúng trỏ đến d1 và d2 tương ứng.
  • trong khi a không null
    • if giá trị của a
    • tiếp theo của dp1:=một nút mới có giá trị là một
    • dp1:=con trỏ tiếp theo của dp1
  • nếu không thì
    • tiếp theo của dp2:=một nút mới có giá trị là một
    • dp2:=con trỏ tiếp theo của dp2
  • a:=tiếp theo của một
  • tiếp theo của dp1:=tiếp theo của d2
  • quay lại phần tiếp theo của d1
  • Ví dụ (C ++)

    Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    #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));
    }

    Đầu vào

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

    Đầu ra

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