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를 가리키고 있습니다.
  • null이 아닌 동안
    • 값인 경우
    • dp1 옆:=값이
    • 인 새 노드
    • dp1 :=dp1의 다음 포인터
  • 그렇지 않으면
    • dp2 옆:=값이
    • 인 새 노드
    • dp2 :=dp2의 다음 포인터
  • 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, ]