কম্পিউটার টিউটোরিয়াল

C++-এ কে-গ্রুপ-এ নোডস রিভার্স (Reverse Nodes in k-Group)


ধরুন আমাদের কাছে একটি লিংকড লিস্ট আছে। আমাদের কাজ হল লিংকড লিস্টের নোডগুলো k সংখ্যা গ্রুপে রিভার্স (reverse) করা এবং মডিফাইড লিস্ট রিটার্ন করা। এখানে k একটি ধনাত্মক পূর্ণসংখ্যা এবং লিংকড লিস্টের দৈর্ঘ্যের চেয়ে কম বা সমান। যদি নোডের সংখ্যা k-এর গুণিতক না হয়, তবে শেষের বাকি নোডগুলো অপরিবর্তিত থাকবে।

যেমন, লিংকড লিস্ট [1,2,3,4,5,6,7] এবং k = 3 হলে ফলাফল হবে [3,2,1,6,5,4,7]।

সমাধানের ধাপসমূহ:

  • solve() নামে একটি মেথড সংজ্ঞায়িত করুন যা হেড, partCount এবং k গ্রহণ করবে

  • যদি partCount = 0 হয় তবে হেড রিটার্ন করুন

  • newHead := head, prev := null, x := k

  • যখন newHead != null এবং x != 0: temp := newHead->next, newHead->next := prev, prev := newHead, newHead := temp

  • head->next := solve(newHead, partCount - 1, k)

  • prev রিটার্ন করুন

  • মূল ফাংশন থেকে: solve(head, length/k, k) রিটার্ন করুন

উদাহরণ

#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) { 
        cout << ptr->val << ", "; 
        ptr = ptr->next; 
    } 
    cout << "]" << endl; 
} 

class Solution { 
public: 
    ListNode* solve(ListNode* head, int partitionCount, int k) { 
        if(partitionCount == 0) return head; 
        ListNode *newHead = head; 
        ListNode* prev = NULL; 
        ListNode* temp; 
        int x = k; 
        while(newHead && x--) { 
            temp = newHead->next; 
            newHead->next = prev; 
            prev = newHead; 
            newHead = temp; 
        } 
        head->next = solve(newHead, partitionCount - 1, k); 
        return prev; 
    } 
    
    int calcLength(ListNode* head) { 
        int len = 0; 
        ListNode* curr = head; 
        while(curr) { len++; curr = curr->next; } 
        return len; 
    } 
    
    ListNode* reverseKGroup(ListNode* head, int k) { 
        int length = calcLength(head); 
        return solve(head, length / k, k); 
    } 
}; 

int main() { 
    vector<int> v = {1,2,3,4,5,6,7}; 
    ListNode *head = make_list(v); 
    Solution ob; 
    print_list(ob.reverseKGroup(head, 3)); 
    return 0;
}

ইনপুট

1,2,3,4,5,6,7 3

আউটপুট

[3, 2, 1, 6, 5, 4, 7, ]
  1. C++-এ ট্রি নোড মুছে ফেলা

  2. C++ STL-এ deque::crend()

  3. C++ STL-এ List reverse ফাংশন

  4. C++-এ সম্পূর্ণ বাইনারি ট্রির নোড গণনা (Count Complete Tree Nodes)