কম্পিউটার

C++ এ রিভার্স লিঙ্কড লিস্ট II


ধরুন আমরা একটি লিঙ্ক তালিকা আছে. আমাদের অবস্থান m থেকে n পর্যন্ত নোডগুলিকে উল্টাতে হবে। আমাদের এটা এক পাসে করতে হবে। তাই যদি তালিকা হয় [1,2,3,4,5] এবং m =2 এবং n =4, তাহলে ফলাফল হবে [1,4,,3,2,5]

আসুন ধাপগুলো দেখি -

  • দুটি পদ্ধতি থাকবে, reverseN() এবং reverseBetween()। reverseBetween() প্রধান পদ্ধতি হিসেবে কাজ করবে।
  • একটি লিঙ্ক নোড পয়েন্টারকে সংজ্ঞায়িত করুন যাকে উত্তরসূরি বলা হয় নাল হিসাবে
  • বিপরীত N নিচের মত কাজ করবে -
  • যদি n =1 হয়, তাহলে উত্তরাধিকারী :=মাথার পরের, এবং হেড রিটার্ন করুন
  • শেষ =reverseN(মাথার পাশে, n - 1)
  • এর পরের (মাথার পরের) =মাথা, এবং মাথার পরের :=উত্তরাধিকারী, শেষ ফিরে
  • reverseBetween() পদ্ধতি −
  • এর মত হবে
  • যদি m =1 হয়, তাহলে reverseN(head, n) ফেরত দিন
  • মাথার পাশে :=বিপরীতের মধ্যে (মাথার পাশে, m – 1, n – 1)

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#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* successor = NULL;
      ListNode* reverseN(ListNode* head, int n ){
         if(n == 1){
            successor = head->next;
            return head;
         }
         ListNode* last = reverseN(head->next, n - 1);
         head->next->next = head;
         head->next = successor;
         return last;
      }
      ListNode* reverseBetween(ListNode* head, int m, int n) {
      if(m == 1){
            return reverseN(head, n);
      }
      head->next = reverseBetween(head->next, m - 1, n - 1);
            return head;
   }
 };
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5,6,7,8};
   ListNode *head = make_list(v);
   print_list(ob.reverseBetween(head, 2, 6));
}

ইনপুট

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

আউটপুট

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

  1. C++ এ লিঙ্ক করা তালিকায় প্রথম অ-পুনরাবৃত্তি

  2. C++ এ বাছাই করা লিঙ্কযুক্ত তালিকায় মিডিয়ান খোঁজা

  3. C++ এ একটি লিঙ্কযুক্ত তালিকা সমতল করা

  4. C++ এ লিঙ্ক করা তালিকার বিকল্প নোডের যোগফল